python找零_python 找零问题 动态规划

题目描述:

现有的钱币:coins=[1,2,5,7,10]

找零:change(假定为正整数)

求解:如何用最少的钱币进行找零

分析:可以使用动态规划

比如找零8元,可以将问题进行分解

dp[8]=dp[8-coins[j]]+1

即:

dp[8]=dp[8-1]+1=dp[7]+1

dp[8]=dp[8-2]+1=dp[6]+1

dp[8]=dp[8-5]+1=dp[3]+1

dp[8]=dp[8-7]+1=dp[1]+1

初始化:

dp=[change+1]*(change+1) #对应的dp[0],dp[1],dp[2]...dp[change]

dp[0]=0 #因为找0元需要0张钱币

使用的钱币初始化:

coins_used=[0]*(change+1)

代码:

def coin_change(coins,change,dp,coins_used):

'''利用动态规划求解找零需要的钱币张数,以及钱币的使用情况'''

for i in range(1,change+1):

#依次求解,dp[1]~dp[change]

for j in range(len(coins)):

if coins[j]<=i:

#使用这张钱币的前提,纸币的金额数<=需要找零的金额,比如:找零8块,不能使用10块的钱币

if dp[i-coins[j]]+1change:

#无解的情况,初始化的时候设置dp[change]=change+1

return -1

else:

return dp[change]

def used_coins(change,used_coins):

'''利用used_coins求解使用的钱币'''

re=[]

while change:

#dp[i]=dp[i-coins[j]]+1 used_coins[change]=coins[j]

tmp=used_coins[change]

re.append(tmp)

change-=tmp

return re

if __name__=='__main__':

#初始化

coins=[1,2,5,7,10]

change=16

dp=[change+1]*(change+1)

dp[0]=0

coins_used=[0]*(change+1)

re=coin_change(coins,change,dp,coins_used)

re_coins=used_coins(change,coins_used)

print("找零{0}元需要{1}张钱币,分别是{2}".format(change,re,re_coins))

执行结果:

找零16元需要3张钱币,分别是[1, 5, 10]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值