【题目】:给定数组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. jmeter的简单http接口用法

    1.  jmeter的启动:windows下的环境 进入jmeter的并目录双击启动 Mac电脑 进入bin目录找到jmeter.sh 文件 在终端执行./jmeter.sh 或者./jmeter. ...

  2. springboot2.0 springcloud 断路器仪表盘支持

    springboot 1.5 的时候  springcloud 添加 断路器仪表盘  按照网上的方法是没有问题的  但是 springboot2.0的时候一直无法连接 所以需要添加 @Beanpubl ...

  3. Excel 导入 Mysql

    1.将Excel xls文件 另存为 csv 文件: 2.用记事本打开csv文件,然后另存为编码为utf-8的txt文件: 3.将txt文件后缀更改为csv 4.最后,用phpmyadmin或其他数据 ...

  4. Java 静态代码的作用

    public student{ private static int MAXNUM=100; static{ System.out.println(MAXNUM); } student(){ Syst ...

  5. QT心电图设计

    不需要别的UI设置,直接放在QT文件中即可 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #includ ...

  6. OpenStack控制节点上搭建Q版glance服务(step4)

    glance服务监听两个端口:9191和9292 其中9292端口是对外提供服务的,9191是服务组件间使用的. 1.安装glance组件 yum --enablerepo=centos-openst ...

  7. Eclipse中Java build path的使用

    1.Eclipse中,工程属性的Java Build Path的Library标签页下,有如下几个按钮:Add Jars...添加JAR包,是指本Eclipse当前包含的工程中的,在工程列表下选取即可 ...

  8. iis重写模块实现程序自动二级域名,微软提供的URL重写2.0版本适用IIS以上

    在iis7以后微软提供了url重写2.0版本,可以通过安装重写组件来实现.适用于iis7以上版本. 安装有两种方式可以选择,一是下载安装文件,二是通过“web平台安装程序”安装 1.下载安装文件 下载 ...

  9. 京东饭粒捡漏V1.0.8

    20180617 更新 V1.0.81.捡漏策略更新:自动检测商品,有货后自动下单:2.加车自动使用最优满减券组合: 功能介绍1.京东商城专用,支持饭粒模式下单,自己获得京豆返利 2.捡漏模式:帮助用 ...

  10. azkaban执行错误 Job failed, Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job

    azkaban默认需要3G的内存,剩余内存不足则会报异常. 配置文件,设置 azkaban-web-server-2.7.0/plugins/jobtypes/commonprivate.proper ...