题目就是给了你一个非升序的数列,让你求出所有的可以得到的某个确定和的数列.
需要注意的有这么几点:1,题目中要求很严格,是不允许输出一样的序列的.所以,你就只能把相邻两个相等得给筛去,当然这是同一递归层才筛去,不是同一递归层的你不能筛去.就要用到一个一个语句了 if(a[i]!=a[i-1]||j==pos+1)就可以解决这个问题.两个条件中满足其中的一个就执行,但咱们所需要筛去的恰恰是这两个条件都满足.
还要注意的就是DFS()回溯的时候的参数问题. 你可千万别把sum算出来再传进去.那样你回溯回来的时候想再用sum可就不行了,你可以选择来个t保留一下,当然更好的选择是你传sum+a[i];
贴上代码:(找错误找了N久......泪奔)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
int T,N;//SUM donates the sum of all the integers,N donates the number of input;
int a[105];
int rec[105];
int temp;
void DFS(int sta,int n,int sum)
{
if(sum==T)
{
temp=1;
for(int i=1;i<=n;i++)
{
printf(i==1?"%d":"+%d",a[rec[i]]);
}
puts("");
return;
}
for(int j=sta+1;j<=N;j++)
{
if(a[j]!=a[j-1]||j==sta+1)
{
if(T>=sum+a[j])
{
rec[n+1]=j;
DFS(j,n+1,sum+a[j]);
}
}
}
}
int main()
{
while(scanf("%d%d",&T,&N),T|N)
{
temp=0;
a[0]=-1;
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i]);
}
printf("Sums of %d:\n",T);
DFS(0,0,0);
if(temp==0)
printf("NONE\n");
}
return 0;
}