写这个用了不少容器 记录一下
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <iterator>
#include <cmath>
#include <deque>
#include <stack>
#include <cctype>
#include <iomanip>
#include <sstream>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N = 15;
const int INF = 0xfffffff;
const double EPS = 1e-8;
const ll MOD = 1e9 + 7;
const ld PI = acos (-1.0);
#define INFL 0x7fffffffffffffffLL
#define met(a, b) memset(a, b, sizeof(a))
#define put(a) cout << setiosflags(ios::fixed) << setprecision(a)
bool vis[N], res;
int a[N], k, n;
vector <string> ve;
void dfs (int x, int ans);
void cot (int x);
string change (int x);
int main ()
{
while (cin >> k >> n, k || n)
{
ve.clear();
for (int i=0; i<n; i++)
cin >> a[i];
met (vis, false);
res = false;
cout << "Sums of " << k << ":\n";
dfs (0, 0);
if (!res) puts("NONE");
}
return 0;
}
void dfs (int x, int ans)
{
if (ans > k || x > n) return;
if (ans == k) {res = true; cot (x); return;}
vis[x] = true;
dfs (x + 1, ans + a[x]);
vis[x] = false;
dfs (x + 1, ans);
}
void cot (int x)
{
int i;
string s;
bool flag = false;
for (i=0; i<n; i++)
{
if (vis[i])
{
if (flag) s += "+";
else flag = true;
stringstream ss;
ss << a[i];
s += ss.str();
}
}
vector <string> :: iterator it;
it = find (ve.begin(), ve.end(), s);
if (it == ve.end())
{
ve.push_back (s);
cout << s << endl;
}
}