给定量x应该在硬币系统C = {c1,c2,... ck}中改变,使得每个硬币ci具有给定的权重wi。我们想计算可能的变化的总重量。如果它们以不同的顺序包含相同的硬币,则两个变化是不同的。
我们如何为上述问题提供动态编程递归?我知道最小硬币变化问题的递归(即C(x)= min {C(x-c)+1,x> 0})。但我的困惑是可能的变化的总重量。谢谢。
答案 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);
}