动态规划-换钱最少货币数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划-换钱最少货币数相关的知识,希望对你有一定的参考价值。
#encoding:utf-8
_author_ = "Wang Wenchao"
#换钱最少的货币数
#给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个正数aim代表要找的钱数,求组成aim的最少货币数
‘‘‘ arr=[5,2,3],aim=20
4张5元可以组成20元,所以返回4
arr=[5,2,3],aim=0
返回0
arr=[3,5],aim=2
返回-1
‘‘‘
#解法:arr长度为N,生成行数为N的,列数为aim+1的二维数组dp# ,dp[i][j]表示使用arr[0...i]的时候组成aim需要最少的张数
def minNumMoney(arr,aim):
dp=[[0]*(aim+1) for i in range(len(arr))]
for j in range(1,aim+1):
if j%arr[0]==0:
dp[0][j]=j/arr[0]
for i in range(1,len(arr)):
for j in range(1,aim+1):
min=pow(2,32)-1
f=0
while j-f*arr[i]>0:
if dp[i-1][j-f*arr[i]]!=0:
count=dp[i-1][j-f*arr[i]]+f
if min>count:
min=count
f+=1
if j-f*arr[i]==0:
if min > f:
min=f
if min!=pow(2,32)-1:
dp[i][j]=min
for i in dp:
print i
return dp[len(arr)-1][aim]
print minNumMoney([5,2,3],20)
#不允许重复
#给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,再给定一个正数aim代表要找的钱数,求组成aim的最少货币数
‘‘‘ arr=[5,2,3],aim=20
返回-1
arr=[5,2,3,5],aim=10
返回2
arr=[5,2,3,5],aim=15
返回4
arr=[5,2,3,5],aim=0
返回4
‘‘‘#解法:arr长度为N,生成行数为N的,列数为aim+1的二维数组dp# ,dp[i][j]表示使用arr[0...i]的时候组成aim需要最少的张数
def minNumMoney(arr,aim):
dp=[[0]*(aim+1) for i in range(len(arr))]
for j in range(1,aim+1):
if j==arr[0]:
dp[0][j]=1
break
for i in range(1,len(arr)):
for j in range(1,aim+1):
min=pow(2,32)-1
if dp[i-1][j-arr[i]]!=0:
count=dp[i-1][j-arr[i]]+1
if min>count:
min=count
if j-arr[i]==0:
min=1
if min!=pow(2,32)-1:
dp[i][j]=min
for i in dp:
print i
return dp[len(arr)-1][aim]
print minNumMoney([5,2,2,4],4)
以上是关于动态规划-换钱最少货币数的主要内容,如果未能解决你的问题,请参考以下文章
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段
算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)