我在这里遇到了硬币更改问题的解决方案:Coin Change。在这里,我能够理解第一个递归方法,第二个使用DP和2D数组的方法。但我无法理解第三种解决方案背后的逻辑。
据我所知,最后一种方法适用于考虑硬币变化中使用的硬币序列的问题。我对么?如果我错了,任何人都可以解释我。
答案 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]