【发布时间】:2014-01-03 18:27:35
【问题描述】:
问题是关于硬币的变化——“你可以用多少种方法来换 3,5,10 美元 如果你有 5c,10c ......
"http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=83
问题在各种博客上多次解决(解决方案here)
在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。只有一种方式: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]
你能解释一下第一种情况吗? n[i][m] = n[i-1][m] + n[i][m - coin[i]]?
【问题讨论】:
-
为什么没人看这个问题?
标签: recursion dynamic-programming acm-java-libraries