java动态编程解决分硬币问题,动态编程硬币更改问题

我在理解各种问题的动态编程解决方案时遇到问题,特别是硬币找零问题:

“给定值N,如果我们要N分钱找零,并且我们有无限数量的S = {S1,S2,..,Sm}硬币的供应,我们可以用几种方法进行找零?硬币没关系。

例如,对于N = 4和S = {1,2,3},有四个解:{1,1,1,1},{1,1,2},{2,2},{1, 3}。因此输出应为4。对于N = 10且S

= {2,5,3,6},有五个解:{2,2,2,2,2},{2,2,3,3}, {2,2,6},{2,3,5}和{5,5}。因此输出应为5。”

此问题还有另一个变体,解决方案是满足该数量的最小硬币数量。

这些问题看起来非常相似,但是解决方案却非常 不同 。

进行更改的可能方法的数量:最佳的子结构为 DP(m,n)= DP(m-1,n)+ DP(m,n-Sm)

,其中DP是所有硬币的解数,直至第m个硬币,金额= n。

最小数量的硬币:最优的子结构是 DP [i] = Min {DP [i-d1],DP [i-d2],… DP [i-dn]} + 1

其中,i是总量和d1..dn代表每种硬币面额。

为什么第一个需要二维数组,而第二个需要1-D数组呢?为什么更改方式的最优子结构不是“ DP [i] = DP [i-d1] + DP [i-d2] +

… DP [i-dn] ”,其中DP

[i]是我可以通过硬币获得数量的方法的数量。这对我来说听起来合乎逻辑,但会产生错误的答案。为什么在此问题中需要硬币的第二维,而在最小金额问题中却不需要?

问题链接:

提前致谢。我访问的每个网站仅说明该解决方案的工作原理,而不说明其他解决方案为何不工作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值