【问题标题】:Dynamic Programming for coin change硬币找零的动态规划
【发布时间】:2016-11-08 09:05:59
【问题描述】:

在硬币系统 C = {c1, c2, ... ck} 中应该改变给定的数量 x,使得每个硬币 ci 具有给定的重量 wi。我们想计算可能变化的总权重。如果两个零钱以不同的顺序包含相同的硬币,则它们是不同的。

我们如何为上述问题提供动态规划递归?我知道最小硬币找零问题的递归(即 C(x)=min{C(x-c)+1 for x>0})。但我的困惑是可能的变化的总重量。谢谢。

【问题讨论】:

  • 不清楚,权重是怎么考虑的?

标签: algorithm dynamic-programming computer-science


【解决方案1】:

看起来天真的方法“将答案存储在数组中”有效。令C[i]代表硬币价值,W[i]代表硬币重量,N是硬币数量。

递归部分如下所示:

long sum = 0;
for (int i = 0; i < N; ++i)
    if (C[i] <= x)
        sum += W[i] + total_change_weight(x-C[i]);

没有输入、输出和 C/W 初始化的示例程序如下:

#define N   10
#define MAX_VALUE   101

long C[N];
long W[N];
long totals[MAX_VALUE];

long total_change_weight(long x) 
{
    if (x == 0) 
        return 0;
    if (totals[x] >= 0)
        return totals[x];

    long sum = 0;
    for (int i = 0; i < N; ++i)
        if (C[i] <= x)
            sum += W[i] + total_change_weight(x-C[i]);
    totals[x] = sum;

    return sum;
}

void main () 
{
    long value = 100;
    //initialize C
    ...
    //initialize W
    ...
    //initialize totals
    for (long i = 0; i < MAX_VALUE; ++i)
        totals[i] = -1;
    long result = total_change_weight(value);
}

【讨论】:

  • 硬币价值和重量有什么区别?谢谢。
  • 价值是 1 美元;重量是 3 克
  • 我明白了。非常感谢你。但是我们如何在没有伪代码的情况下编写递归呢?
  • 实际上,重要的部分是在 C++ 代码中。我已经用或多或少完整的计算部分更新了答案。在实际应用中,您需要在函数内部使数组 C、N、总计可用,通过 new 初始化它们,检查总计的边界等。
  • 比你。但我仍有疑问。我的问题是找到递归而不是程序代码(如果我没记错的话)
猜你喜欢
  • 2015-05-08
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2018-02-25
  • 1970-01-01
相关资源
最近更新 更多