硬币变换算法 - 具有一维阵列的DP

时间:2015-11-19 19:57:19

标签: dynamic-programming coin-change

我在这里遇到了硬币更改问题的解决方案:Coin Change。在这里,我能够理解第一个递归方法,第二个使用DP和2D数组的方法。但我无法理解第三种解决方案背后的逻辑。

据我所知,最后一种方法适用于考虑硬币变化中使用的硬币序列的问题。我对么?如果我错了,任何人都可以解释我。

2 个答案:

答案 0 :(得分:1)

我自己弄明白了!

使用归纳可以很容易地证明这一点。让table [k]表示可以给出总共k的变化方式。现在算法由两个循环组成,一个由i控制并遍历包含所有不同硬币的数组,另一个是j控制循环,对于给定的i,它更新数组表中元素的所有值。现在考虑一个固定的i,我们计算了从1到n的所有值的变化方式的数量,这些值存储在表[1]到表[n]的表中。当i控制循环迭代i + 1时,表[j]中任意j的值增加表[jS [i + 1]],这只是我们可以使用至少一个硬币创建j的方式值S [i + 1](存储硬币值的数组)。因此,表[j]中的总值等于我们可以使用值为S [1]的硬币创建变更的方式.... S [i](之前已经存储过)和值表[jS [i] + 1]]。这与递归算法中使用的问题的最优子结构相同。

答案 1 :(得分:0)

int arr[size];
memset(arr,0,sizeof(size));
int n;
cin>>n;
int sum;
cin>>sum;
int a[size];
fi(i,n)
cin>>a[i];
arr[0]=1;
fi(i,n)
for(int j=arr[i]; j<=n; j++)
    a[j]+=a[j-arr[i]];
cout<<arr[n];

数组arr初始化为0,以显示i之和的表示方式为零(即未初始化)。但是,可以表示0之和的方式的数量是1(零路)。 此外,我们拿出每个硬币并从硬币面额开始初始化阵列中的每个位置。 a[j]+=a[j-arr[i]]意味着我们基本上按照前面提到的方式(j)增加了表示总和j-arr[i]的可能方式。 最后,我们输出a[n]