【问题标题】:Easy dynamic programming recursive formula (uva 147 coin change)易动态规划递归公式(uva 147 硬币找零)
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 2020-09-22
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多