【发布时间】:2015-06-27 15:29:51
【问题描述】:
按照this method (pdf) 实现递归解决方案,但我认为它有问题。我已经按照 pdf 文件中的描述完全实现了它。
下面代码的输出是错误的。它显示了目标位置。目标数组包含应相加以获得总和的数字的位表示。
将binary[i] = 1 放在else if 条件中可以解决问题,但没有意义。
是否有可能澄清什么是正确的解决方案?
#define SIZE(a) sizeof(a)/sizeof(a[0])
int binary[100];
void foo(int target, int i, int sum, int *a, int size) {
binary[i] = 1;
if (target == sum+a[i]) {
int j;
for (j=0;j<size;j++)
printf("%d\n", binary[j]);
return;
} else if ((i+1 < size) && (sum + a[i] < target)) {
foo(target, i+1, sum + a[i], a, size);
}
if ((i+1 < size) && (sum +a[i+1] <= target)) {
binary[i] = 0;
foo(target, i+1, sum, a, size);
}
}
int main()
{
int i, target =10,a[] = {1, 2, 3, 5, 100};
foo(target, 0, 0, a, SIZE(a));
}
当前输出:0 1 1 1 1
预期输出:0 1 1 1 0
【问题讨论】:
-
哪种语言? C? C++?请相应标记
-
请添加当前输出,以及您期望的正确输出。也尽量让自己更容易,不要使用
t、i和a,而是使用有意义的变量名。
标签: c algorithm recursion subset-sum