动态规划问题之贪婪算法实现硬币最优解

举报
是Dream呀 发表于 2022/01/22 00:04:36 2022/01/22
【摘要】 动态规划问题之贪婪算法实现硬币最优解 贪婪问题实现最少的硬币找零问题: start_time = time.time() end_time = time.time() print(‘Took %f se...

动态规划问题之贪婪算法实现硬币最优解在这里插入图片描述

贪婪问题实现最少的硬币找零问题:
start_time = time.time()
end_time = time.time()
print(‘Took %f second’ % (end_time - start_time))
是我们加入用来计算运算时间的

首先定义一个函数:rec(coinValueList,change) 其中coinValueList是我们的硬币的面值,change是我们的需要找零的金额
[c for c in coinValueList if c<=change]:这里创建一个列表用来存储这次找零可以用到的面值金额,然后进行循环调用和递归运算。

import time
start_time = time.time()

def rec(coinValueList,change):
    minCoins=change
    if change in coinValueList:
        return 1
    else:
        for i in [c for c in coinValueList if c<=change]:
            numCoins=1+rec(coinValueList,change-i)
            if numCoins<minCoins:
                minCoins=numCoins
    return minCoins
print(rec([1,5,10,25],63))
end_time = time.time()
print('Took %f second' % (end_time - start_time))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述
我们可以看出这种算法耗时非常多,需要进行优化:
加入一个可查询的列表,就不用重复计算已经算过的此面值最优的找零方法,可以节约非常巨大的一部分时间。

import time
start_time = time.time()

def rec(coinValueList,change,list):
    minCoins=change
    if change in coinValueList:
        list[change]=1
        return 1
    elif list[change]>0:
        return list[change]
    else:
        for i in [c for c in coinValueList if c<=change]:
            numCoins=1+rec(coinValueList,change-i,list)
            if numCoins<minCoins:
                minCoins=numCoins
                list[change]=minCoins
    return minCoins
print(rec([1,5,10,25],63,[0]*64))
end_time = time.time()
print('Took %f second' % (end_time - start_time))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述

文章来源: xuyipeng.blog.csdn.net,作者:是Dream呀,版权归原作者所有,如需转载,请联系作者。

原文链接:xuyipeng.blog.csdn.net/article/details/119205911

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。