-1

问题是关于硬币的变化 - “如果你有 5c,10c 有多少种方法可以兑换 3,5,10 美元......

" http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=83

这个问题在各种博客上解决了很多次(解决方案 在这里

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

我只给出了将方法存储到二维表中的实际 for 循环,如解决方案:

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];
}

}

==================================

实际的重要代码:

  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。只有 1 种方式:5c = 1 * 5c(存储 n[5][coin(5)])

  • 我有 5c 和 2 个硬币可以使用:5c 和 10c 我不能同时使用 5C 和 10c => 我回到 1 种方式(将 1 存储在表中 n[5][coin(5, 10)]) 对于这种情况

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

你能解释一下第一个if case吗? n[i][m] = n[i-1][m] + n[i][m - 硬币[i]]

4

1 回答 1

0

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

硬币找零循环:a[i][j] = a[i-1][j] (d[i] > j) (如果硬币不能用,那就不要用)

a[i][j] = a[i-1][j] + a[i][jd[i]] (d[i] <= j) (如果可以使用硬币:不要使用 OR用它)

于 2014-01-04T08:44:06.863 回答