由于最多12个数,所以直接暴力搜索就可以。但是关键是如何判断是否重复,这里借鉴一下神奇的判重。就是每次判断和上一层深搜的是否一样,一样的就不再搜
#include <iostream>
#include <cstdlib>
using namespace std;
int t, n;
int flag;
int a[15],ans[15];
void dfs(int now, int sum, int cnt)
{
if (sum == 0)
{
flag = 1;
cout << ans[0];
for (int i = 1; i < cnt; ++ i)
{
cout << "+" << ans[i];
}
cout << endl;
return;
}
else
{
int pre = -1;
for (int i = now; i < n; ++ i)
{
if (sum >= a[i] && a[i] != pre)
{
pre = a[i];
ans[cnt] = a[i];
dfs(i + 1, sum - a[i], cnt + 1);
}
}
}
}
int main()
{
while (cin >> t >> n)
{
if (n == 0)
{
break;
}
for (int i = 0; i < n; ++ i)
{
cin >> a[i];
}
flag = 0;
cout << "Sums of " << t << ":" << endl;
dfs(0, t, 0);
if (! flag)
{
cout << "NONE" << endl;
}
}
return 0;
}