Algorithm 硬币兑换,但每种面额的硬币只有1枚

Algorithm 硬币兑换,但每种面额的硬币只有1枚,algorithm,dynamic-programming,asymptotic-complexity,correctness,Algorithm,Dynamic Programming,Asymptotic Complexity,Correctness,问题是: 我提出的算法类似于: pair<bool, bitmask>[n][A] memo; // memo[i][j].first will be true if its possible to // use up to i-th denomination for amt j // memo[i][j].second will contain info on which // denominations are used for i = 0 to n: f

问题是:

我提出的算法类似于:

pair<bool, bitmask>[n][A] memo;     
// memo[i][j].first will be true if its possible to 
// use up to i-th denomination for amt j
// memo[i][j].second will contain info on which 
// denominations are used
for i = 0 to n:
    for j = 1 to A:
    if (i==j): C[i][j] = {true, {i}}
    else if (C[i-1][j].first == true): C[i][j] = C[i-1][j]]
    else if (...see recurrance relation...): 
        C[i][j] = {true, C[i-1][j]+{denom[i]}}
    else: C[i][j] = false
pair[n][A]备忘录;
//备注[i][j]。如果可能,第一个将为真
//金额j最多使用第i个面额
//备忘录[i][j]。第二个将包含以下信息:
//使用面额
对于i=0到n:
对于j=1到A:
如果(i==j):C[i][j]={true,{i}
else if(C[i-1][j]。first==true):C[i][j]=C[i-1][j]]
否则,如果(…参见重现关系…):
C[i][j]={true,C[i-1][j]+{denom[i]}
else:C[i][j]=假
到目前为止是正确的吗?但我不确定如何证明它的正确性。。。我的尝试看起来就像是用英语重写代码

对于第一个if:我们总是可以使用1枚面额为i的硬币来求解 金额=i。对于第一种情况,如果:如果我们有一个不带 使用当前名称,我们可以重用该解决方案。第二
else if:如果可以使用当前名称(是的,我想说您在这里完全正确。您正在解决的问题本质上是子集和问题,您的解决方案是标准的动态规划问题(请参阅)

就正确性而言,我会说解释重复关系和基本情况就可以了。从风格上讲,我不会通读代码并证明每一行,而是专注于大局。因此,只要解释一下您的表代表什么,以及如何设置基本情况和重复关系,读者就可以很容易去看看代码,看看你实现了什么


对于运行时:是的,您的算法只是循环遍历表中的元素并填充它们,因此您的解释是正确的。

使用文本,而不是图像。图像不可搜索。