硬币变化的动态规划

时间:2016-11-08 09:06:00

标签: algorithm dynamic-programming computer-science

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

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

1 个答案:

答案 0 :(得分:0)

看起来像天真的方法"在数组中存储答案"作品。设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);
}