【题目】:给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币仅可以使用一张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。

【代码1】:时间与额外空间复杂度O(N*aim)

import numpy as np
from xmlrpc.client import MAXINT def mincoin(arr,aim):
if len(arr)<0:
print("No coin provided for change!")
if sum(arr)<aim:
print("Coins provided not enough for change!")
arr.sort()
arr.reverse()
if aim == 0:
print("Aim is 0, no need to change!")
i = 0
j = 0
maxval = 99#MAXINT
dp = np.zeros((len(arr),aim+1))
for i in range(1,len(arr)):
dp[i] = np.array([99]*(aim+1))
dp[i][0] = 0 if arr[0]<= aim:
dp[0][arr[0]] = 1 left = 0
for i in range(1,len(arr)):
for j in range(1,aim+1):
left = maxval
if j-arr[i] >= 0 and dp[i-1][j-arr[i]] != maxval:
left = dp[i-1][j-arr[i]]+1
dp[i][j] = min(left,dp[i-1][j]) #print(dp)
#print('Need ',int(dp[aim]),' Coins.')
print('Need ',int(dp[len(arr)-1][aim]),' Coins.') # ===CALL === #
a = [5,2,3,5,8]
tar = 20
mincoin(a,tar)

【代码2】:时间复杂度O(N*aim),额外空间复杂度O(aim)

import numpy as np
from xmlrpc.client import MAXINT def mincoin(arr,aim):
if len(arr)<0:
print("No coin provided for change!")
if sum(arr)<aim:
print("Coins provided not enough for change!")
arr.sort()
arr.reverse()
if aim == 0:
print("Aim is 0, no need to change!")
i = 0
j = 0
maxval = 99#MAXINT
dp = np.array([99]*(aim+1))
dp[0] = 0 if arr[0]<= aim:
dp[arr[0]] = 1 left = 0
for i in range(1,len(arr)):
for j in range(1,aim+1):
left = maxval
if j-arr[i] >= 0 and dp[j-arr[i]] != maxval:
left = dp[j-arr[i]]+1
dp[j] = min(left,dp[j]) #print(dp)
#print('Need ',int(dp[aim]),' Coins.')
print('Need ',int(dp[aim]),' Coins.') # ===CALL === #
a = [5,2,3,5,8]
tar = 20
mincoin(a,tar)

【代码3】:时间复杂度O(N*aim),额外空间复杂度O(aim) 

同样的在原书也就是【代码2】的基础上,下面的执行效率会更高一点点,但是这种算法对于【代码1】的复杂度是有问题的。

import numpy as np
from xmlrpc.client import MAXINT def mincoin(arr,aim):
if len(arr)<0:
print("No coin provided for change!")
if sum(arr)<aim:
print("Coins provided not enough for change!")
arr.sort()
arr.reverse()
if aim == 0:
print("Aim is 0, no need to change!")
i = 0
j = 0
maxval = 99#MAXINT
dp = np.array([99]*(aim+1))
dp[0] = 0 if arr[0]<= aim:
dp[arr[0]] = 1 left = 0
for i in range(1,len(arr)):
for j in range(j-arr[i],aim+1):
left = maxval
if dp[j-arr[i]] != maxval:
left = dp[j-arr[i]]+1
dp[j] = min(left,dp[j]) #print(dp)
#print('Need ',int(dp[aim]),' Coins.')
print('Need ',int(dp[aim]),' Coins.') # ===CALL === #
a = [5,2,3,5,8]
tar = 20
mincoin(a,tar)

算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)的更多相关文章

  1. OptimalSolution(1)--递归和动态规划(2)矩阵的最小路径和与换钱的最少货币数问题

    一.矩阵的最小路径和 1 3 5 9 1 4 9 18 1 4 9 18 8 1 3 4 9 9 5 8 12 5 0 6 1 14 14 5 11 12 8 8 4 0 22 22 13 15 12 ...

  2. 算法之Python实现 - 001 : 换钱的最少货币数

    [题目]给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. [代码1]:时间与额外 ...

  3. [程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)

    题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0 ...

  4. [DP]换钱的最小货币数

    题目一 给定数组arr,数组中有N个元素,其中所有的之都为整数且不重复.每个只代表一种面值的货币,每种面值的货币可以使用任意张,在给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 解法 依 ...

  5. 数据结构与算法(Python)

    数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰 ...

  6. 八大排序算法的 Python 实现

    转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...

  7. 数据关联分析 association analysis (Aprior算法,python代码)

    1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...

  8. 机器学习算法与Python实践之(四)支持向量机(SVM)实现

    机器学习算法与Python实践之(四)支持向量机(SVM)实现 机器学习算法与Python实践之(四)支持向量机(SVM)实现 zouxy09@qq.com http://blog.csdn.net/ ...

  9. 机器学习算法与Python实践之(三)支持向量机(SVM)进阶

    机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 zouxy09@qq.com http://blog.csdn.net/ ...

随机推荐

  1. python 基础之自动类型转换和强制类型转换

    一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...

  2. git代理配置

    命令行模式下配置 git config --global https.proxy https://proxyuser:proxypassword@ip/域名:port git config --glo ...

  3. java-使用icepdf实现pdf转换成png

    下载icepdf的架包,并导入项目中,这里用到4个,如下: /** * 本地pdf文件转png */ public static int pdf2pngByFile(String target){ S ...

  4. HanLP vs LTP 分词功能测试

    文章摘自github,本次测试选用 HanLP 1.6.0 , LTP 3.4.0 测试思路 使用同一份语料训练两个分词库,同一份测试数据测试两个分词库的性能. 语料库选取1998年01月的人民日报语 ...

  5. 常用git的命令

    常用git的命令 详解git fetch与git pull的区别 Git放弃本地所有修改,强制更新: git fetch --all git reset --hard origin/master 说明 ...

  6. 在CentOS 7上安装Nginx

    本教程中的步骤要求用户拥有root权限 第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二 ...

  7. C# 6.0:在catch和finally中使用await

    Asyn方法是一个现在很常用的方法,当使用async和await时,你或许曾有这样的经历,就是你想要在catch块或finally块中使用它们,比如当出现一个exception而你希望将日志记在文件或 ...

  8. Busybox镜像

    使用docker多少还是要知道一些Busybox的知识,下面转载自https://blog.csdn.net/chengqiuming/article/details/79313539 一 简介 Bu ...

  9. nice team(第一次会议)

    在周日经过一番讨论后,nice team成功上线了,四个独特的灵魂聚集在一起,想要一起做一番“大事业”,首先第一篇博客当然就是我们的成员大亮相. 詹晔康:我们组的最强王者,也是我们的项目经理.第一次讨 ...

  10. [UE4]抓取准备

    一.引擎的VR实例工程是使用手柄进行抓取的.我们需要加上可以使用鼠标进行抓取操作. 二.将左右手保存到全局变量. 三.左右手分别调用抓取和扔方法