所以我们给出一个数组v[]={2,6} and d=10
,我们必须打印出每个子数组,以便总和等于d
例如,对于给予d和v[],我们应该打印出这些数组
2 2 2 2 2
6 2 2
2 6 2
2 2 6
这是我目前的程序,但我似乎不能打印任何东西。
我假设问题是当我回到跟踪,但我没有任何目前的想法
#include <stdio.h>
#include <stdlib.h>
void findSolutions(int v[], int n, int d, int current[], int index) {
if(index>n)
{
current=realloc(current,index*sizeof (int));
}
if (d == 0) {
for (int i = 0; i < index; i++) {
printf("%d ", current[i]);
}
printf("\n");
return;
}
if (d < 0 || index >= n) {
return;
}
current[index] = v[index];
findSolutions(v, n, d - v[index], current, index + 1);
findSolutions(v, n, d, current, index + 1);
}
int main() {
int v[] = {2, 6};
int n = 2;
int d = 10;
int *current= malloc(n*sizeof(int));
findSolutions(v, n, d, current, 0);
return 0;
}
2条答案
按热度按时间64jmpszr1#
下面的注解似乎解决了您的代码中的几个问题。一致的格式将使您的生活更轻松。
很明显,这段代码正在将目标值(从
10
)向零(或更低)(即 * 基本情况 *)收缩。聪明,因为这意味着少了一个参数!下面是一个注解版本。我希望这有助于澄清一些事情。
我希望这对你有帮助。。
3phpmpom2#
您的代码使用
malloc()
,但没有使用free()
来释放内存,这将导致内存泄漏。我不知道你为什么在
findSolutions()
中使用两次findSolutions(v, n, d - v[index], current, index + 1);
和findSolutions(v, n, d, current, index + 1);
所以我重写了一下,这是我的答案:
运行它将输出:
如果你认为
2 2 6
和2 6 2
和6 2 2
是相同的结果,然后想立即输出2 2 6
,你可以使用下面的代码:运行它将输出: