http://acm.hdu.edu.cn/showproblem.php?pid=1258
我的第一道索搜题,想了半天还是没有办法去除重复的情况,看了别人的结题报告才知道这么简单,就是用一个变量保存上一次的节点就行。
#include <cstdio>
#include <string>
int a[12], n, m, f, c, d[12],l;
void dfs(int, int);
void show();
int main()
{
while (scanf("%d %d", &n, &m) && n)
{
printf("Sums of %d:\n", n);
int i;
for (i = 0; i < m; i++)
{
scanf("%d", &a[i]);
}
f = 0;
c = -1, l = 0;
dfs(-1, 0);
if (!f)
printf("NONE\n");
}
return 0;
}
void dfs(int k, int sum){
c++;
if (sum == n){
f = 1;
show();
}
else
{
for (int i = k + 1; i < m; i++){
if (sum + a[i] <= n&&l!=a[i]){
d[c] = a[i];
dfs(i, sum + a[i]);
}
}
}
l = a[k];
c--;
}
void show(){
printf("%d", d[0]);
for (int i = 1; i < c; i++){
printf("+%d", d[i]);
}
printf("\n");
}