链接:http://poj.org/problem?id=1564
题目大意:给一个t和n个数要你找出在n个数中找出哪几个数相加和为t,条件是这几个数不能重复且非递增
用深搜来求
收获:在有序的时候判断重复和怎么样非递增遍历
#include<iostream>
using namespace std;
int in[15],out[15],use[15]={0};
int t,n,flag,sum;
void dfs(int s,int k)
{
if(sum>t) return;
if(sum==t)
{
for(int b=0;b<k;b++)
if(b==0)
printf("%d",out[b]);
else
printf("+%d",out[b]);
printf("\n");
flag=1;//标记有没有和为t的
return;
}
int j=-10;
for(int a=s;a<n;a++)
{
if(!use[a]&&j!=in[a])//j!=in[a]用于判断后面有没有相同的数,有的话就跳过
{
j=in[a];
use[a]=1;
out[k]=in[a];
sum=sum+in[a];
dfs(a,k+1);//注意,想要非递增的话这里是a而不是s+1,
use[a]=0;
sum=sum-in[a];//每次回溯记得减in[a]
}
}
}
int main()
{
while(scanf("%d%d",&t,&n),t+n)
{
int a=0;
memset(in,0,sizeof(in));
for(a=0;a<n;a++)
{
scanf("%d",&in[a]);
}
printf("Sums of %d:\n",t);
sum=flag=0;
memset(use,0,sizeof(use));//忘记初始化了...
memset(out,0,sizeof(out));
dfs(0,0);//用两个参数比用一个参数容易些
if(flag==0)
printf("NONE\n");
}
return 0;
}