问题是关于硬币的变化 - “如果你有 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]]?