题意:给出一个数列,求出这个数列中和等于t的所有组合
思路:dfs,cnt用于保存一个数字出现多少次,ans用于保存答案里面一个数有多少次
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int cnt[105];
int ans[105];
int t,n;
bool rec;
void dfs(int now,int sum)
{
if(now<=0)return;
for(int i=cnt[now];i>=0;--i)
{
int tsum=sum+now*i;
ans[now]=i;
if(tsum==t){
rec=1;
bool flag=0;
for(int j=100;j>=0;--j)
{
for(int k=0;k<ans[j];++k)
{
if(!flag){printf("%d",j);flag=1;}
else printf("+%d",j);
}
}
printf("\n");
}else if(tsum<t){
dfs(now-1,tsum);
}
}
}
int main()
{
// freopen("data.txt","r",stdin);
while(scanf("%d%d",&t,&n)){
if(n==0)break;
memset(ans,0,sizeof(ans));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;++i){
int a;
scanf("%d",&a);
cnt[a]++;
}
printf("Sums of %d:\n",t);
rec=0;
dfs(100,0);
if(!rec)printf("NONE\n");
}
return 0;
}