Выполнял этот метод (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
t
,i
иa
, а используйте осмысленные имена переменных. - person wimh   schedule 27.06.2015