【发布时间】:2019-10-30 15:31:37
【问题描述】:
我尝试实现在 Wikipedia 页面上为 pseudo-polynomial time algorithm for subset sum 提出的算法,我们的目标是确定是否存在总和为零的 {x_1, ..., x_N} 的非空子集。因此,我们设置了一个从负数之和 (A) 到正数之和 (B) 的范围,并创建一个矩阵来保存 1 ≤ i ≤ N 和 A ≤ s 的值 Q(i, s) ≤乙。 然后为了填充它,我们应该首先设置 Q(1, s) := (x_1 == s),对于递归情况,我们设置 Q(i, s) := Q(i − 1, s) 或 ( xi == s) 或 Q(i - 1, s - xi),对于 A ≤ s ≤ B。
这是我的想法,其中 inp 包含输入集。我在变量 arrindex 中跟踪 s 的“真实”索引,因为 s 可能是某个负数,我无法将向量索引为负数。
vector<vector<bool>> result (inp.size(), vector<bool>(abs(B-A)+1)); // initialize results matrix
for(int s = A,arrindex=0; s <= B; s++,arrindex++){
if(s == inp[0])
result[0][arrindex] = true;
for(int i = 1; i < inp.size(); i++){
for(int s = A,arrindex=0; s <= B; s++,arrindex++){
// CHECK: Q(i, s) := Q(i − 1, s) or (xi == s) or Q(i − 1, s − xi), for A ≤ s ≤ B
if(s == inp[i] || result[i-1][arrindex] || result[i-1][abs((s - inp[i])-A)])
result[i][arrindex] = true;
}
}
我的尝试给出了答案,但它似乎常常是不正确的。举个简单的例子,如果我的输入是{-2, 1},答案应该是no,但是我得到的矩阵是
1 0 0 0
1 1 0 1
我认为这表示“是”,对吧?所以我的问题是,我是否错误地实施了这一点?还是我解释错了?
【问题讨论】:
-
为什么会显示“是”?答案是
Q(N, 0),它对应于矩阵中的第二行(两个输入值)和第三列(-2、-1、0、1)。
标签: c++ algorithm dynamic-programming subset-sum