题目链接:Sum It Up
题目大意:给出一组数a[n]={x1,x2,x3...xn}和t,求出a[n]的子集使得子集中的元素之和=t
每个数只能使用一次,不能输出重复的子集
分析:简单dfs,vis判断某个数是否使用过
!!!注意不能输出两个相同的子集,即某个数不能再相同的位置使用两次
用last记录上次此位置使用的数,若相同则跳过
#include <stdio.h>
#include <memory.h>
const int maxn=15;
int a[maxn],vis[maxn],t,n;
bool flag;
void dfs(int i,int sum)
{
if(i==n+1)return;
if(sum>t)return;
if(sum==t){
flag=true;
bool atag=false;
for(int k=0;k<i;k++){
if(vis[k]){
if(atag)printf("+");
else {
atag=true;
}
printf("%d",a[k]);
}
}
printf("\n");
}
int last=-1;
for(int k=i;k<n;k++){
if(!vis[k]&&last!=a[k]){
last=a[k];
vis[k]=true;
dfs(k+1,sum+a[k]);
vis[k]=false;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d %d",&t,&n)!=EOF&&(t+n)){
flag=false;
for(int i=0;i<n;i++)scanf("%d",&a[i]);
memset(vis,0,sizeof(vis));
printf("Sums of %d:\n",t);
dfs(0,0);
if(!flag)printf("NONE\n");
}
return 0;
}