DFS搜索。。不能重复出现相同式子的条件有点难办,最开始我想了种方法是不输出与上一次搜到的相同的式子,提交WA,只能去找真正的测试数据,发现有一个测试数据过不了,这种算法是错的。。后来看了看别人的题解,有了点思路,就是记录上次出stack 的元素,下次入stack不与这个元素相同,因为这个元素已经算过和式了,不用再算了,具体看代码吧
#include<stdio.h>
#include<string.h>
static int find, t, n, a[12], flag[12], prev;
static void print()
{
int j, first = 1;
for (j = 0; j < n; j++)
if (flag[j])
{
if (first)
first = 0;
else
putchar('+');
printf("%d", a[j]);
}
putchar('\n');
}
static void dfs(int depth, int sum)
{
int i;
for (i = 0; i < n; i++)
{
if (i > depth && sum + a[i] <= t && a[i] != prev)
//a[i] != prev important!!!
{
flag[i] = 1;
if (sum + a[i] < t)
dfs(i, sum + a[i]);
else
{
if (!find)
find = 1;
print();
}
flag[i] = 0;
prev = a[i]; //key point
}
}
}
int main()
{
while (scanf("%d %d", &t, &n), n)
{
printf("Sums of %d:\n", t);
int i;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
memset(flag, 0, sizeof(flag));
find = 0;
prev = -1;
dfs(-1, 0);
if (!find)
puts("NONE");
}
return 0;
}