硬币问题。

最少硬币问题

 有n种硬币,面值分别为v1,v2,v3···,vn,数量无限。输入非负整数s。要求输出最少的硬币组合。\n\n 定义一个数组int Min[],其中MIn[i]是金额i对应的最少硬币数量。\n\n 以五种面值(1、5、10、25、50)的硬币为例演示递推过程。\n\n 1. 只使用最小面值的1分硬币:Min[0]=0 -> Min[1] = Min[1-1] + 1 = 1 -> Min[2] = Min[2-1] + 1 = 2,持续这个过程,得到递推关系MIn[i] = min(Min[i], Min[i-1] + 1) 。

 2. 在使用1分硬币的基础上增加使用第二小面值5分硬币:Min[5] = Min[5-5] + 1 =1 -> Min[6] = Min[6-1] + 1 = 6。持续这个过程,得到递推关系Min[i] = min(Min[i], MIn[i-5] + 1)。

51285bdcf5504aadb1ab0600f7810ba8.jpg

 打印最少硬币的组合

这种题目状态表需要适当的扩展,以包含更多信息。可以通过增加一个记录表Min_path[i]来记录金额i需要的最后一个硬币。利用记录表逐步倒推来获得所有的硬币。

8b34db1aeef04bbb98281ad503264cb6.jpg

 所有硬币组合问题:

有5中面值的硬币,即1分、5分、10分、25分、50分。输入一个钱数s,输出组合方案的数量。例如11分有四种组合方案,即11个1分、2个5分+1个1分、1个5分+6个1分、1个10分+1个1分。s≤250,硬币数量num≤100。

18ab29d5e689460691f500c07fbdb4b3.jpg

 不完全解决方案

 假设硬币数量不限,模仿前面最少硬币问题的状态转移也能容易地递推出这题的状态转移:dp[i] = dp[i] + dp[i-x](x为硬币面值)。

720749dca73a48e0904c4083ce634d62.jpg

 定义一个二维数组int dp[][]其中dp[i][j]的含义是用j个硬币实现金额i的方案数量。递推得到状态转移:dp[i][j] = dp[i][j] + dp[i-x][j-1]。

c6ef7d456e254c87bb44cdabb6c46419.jpg

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值