题意:给出一个数n 和a1....ak 问这k个数有多少种相加为n的方法,不能重复
题解:DFS记录答案,暴力判重
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans,f[2000][20],tem[20];
vector<int>a;
void dfs(int sum,int k,int num)
{
if (sum==n || k==m )
{
if (sum==n)
{
ans++;
for (int i=1;i<=num;i++)
f[ans][i]=tem[i];
f[ans][0]=num;
}
return;
}
if (sum+a[k]<=n)
{
tem[num+1]=a[k];
dfs(sum+a[k],k+1,num+1);
}
dfs(sum,k+1,num);
}
void Gao()
{
memset(f,0,sizeof(f));
memset(tem,0,sizeof(tem));
a.clear();
ans=0;
for (int i=0;i<m;i++)
{
int x;
cin>>x;
a.push_back(x);
}
sort(a.begin(),a.end());
m=a.size();
reverse(a.begin(),a.end());
dfs(0,0,0);
if (ans==0)
{
cout<<"NONE"<<endl;
return ;
}
else
{
for (int i=1;i<=ans;i++)
{
bool ok=true;
for (int j=1;j<i;j++)
{
bool same=true;
if (f[i][0]!=f[j][0])
continue;
for (int k=1;k<=f[i][0];k++)
{
if (f[i][k]!=f[j][k])
same=false;
}
if (same)
ok=false;
}
if (ok)
{
for (int k=1;k<=f[i][0];k++)
printf(k==1?"%d":"+%d",f[i][k]);
cout<<endl;
}
}
}
}
int main()
{
while (cin>>n>>m &&n)
{
printf("Sums of %d:\n",n);
Gao();
}
return 0;
}