Recursion 简易动态规划递归公式(uva 147硬币兑换)

Recursion 简易动态规划递归公式(uva 147硬币兑换),recursion,dynamic-programming,acm-java-libraries,Recursion,Dynamic Programming,Acm Java Libraries,问题在于硬币兑换——“你可以用多少种方式兑换3、5、10美元?” 如果你有5c,10c " 这个问题在各种博客上多次得到解决(解决方案) 在dp中,最难的事情是理解子问题之间的关系并得到公式(最优子结构) 我只给出了实际的for循环,该循环将路径存储到2d表中,如解决方案所示: for (int i = 2; i <= NCHANGES; ++i){ for (int m = 1; m <= MAX_AMOUNT; ++m){ if (m >= coins[i])

问题在于硬币兑换——“你可以用多少种方式兑换3、5、10美元?” 如果你有5c,10c

"

这个问题在各种博客上多次得到解决(解决方案)

在dp中,最难的事情是理解子问题之间的关系并得到公式(最优子结构)

我只给出了实际的for循环,该循环将路径存储到2d表中,如解决方案所示:

for (int i = 2; i <= NCHANGES; ++i){
for (int m = 1; m <= MAX_AMOUNT; ++m){
  if (m >= coins[i])
    n[i][m] = n[i-1][m] + n[i][m - coins[i]];
  else
    n[i][m] = n[i-1][m];
}
我的想法

例如: (其他情况)

  • 我有5美分和1枚硬币可供使用:5c。只有一种方式:5c=1*5c (商店n[5][coin(5)])

  • 我有5c和2枚硬币的数量可供使用:5c和10c我不能同时使用5c和10c=>我返回到一种方法(将1储存在表中,用于n[5][coin(5,10)]) 对于这种情况

这就是为什么n[i][m]=n[i-1][m]


你能解释一下第一种情况吗n[i][m]=n[i-1][m]+n[i][m-硬币[i]]

好的,我在一个网站上找到了它-同样的问题

硬币兑换周期: a[i][j]=a[i-1][j](d[i]>j) (如果硬币不能使用,则不要使用)


为什么没有人看这个问题?
  if (m >= coins[i])
        n[i][m] = n[i-1][m] + n[i][m - coins[i]];
      else
        n[i][m] = n[i-1][m];