问题是:
我想出的算法是这样的:
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
到目前为止是否正确?但我不确定如何证明它的正确性......我的尝试看起来只是用英文重写代码......
对于第一个如果:我们总是可以使用 1 个面额 i 的硬币来解决 amt=i。对于第一个 else if:如果我们有一个不使用当前面额的 amt 解决方案,我们可以重用该解决方案。对于第二个 else if:如果可以使用当前面额(<= amt),并且不使用面额,我们可以...
对于复杂性:表的大小为 nA。每个单元格需要 O(1) 时间来填充。有人可以帮我指出正确的方向吗?