Sum It Up
#include <bits/stdc++.h>
using namespace std;
const int maxn = 15;
int nums[maxn];
int ans[maxn];
int len;
bool ok;
int sum;
int n;
bool used[maxn];
bool cmp(int a, int b) {
return a > b;
}
void dfs(int idx, int now) {
if(idx <= n && now == sum) {//找到1个解
if(!ok) {
printf("Sums of %d:\n", sum);
}
ok = true;
for(int i = 0; i <= len - 2; i++) {
printf("%d+", ans[i]);
}
printf("%d\n", ans[len-1]);
return;
}
if(idx > n || now > sum) {//不可能有解了
return;
}
//开始选择
for(int i = idx; i < n; ++i) {
if(!used[i]) {
if(i > 0 && nums[i] == nums[i-1] && !used[i-1]) {
used[i] = false;
continue;
}
if(now + nums[i] <= sum) {//可以选
used[i] = true;//选它
ans[len++] = nums[i];
now += nums[i];
dfs(i+1, now);
used[i] = false;//不选它
len--;
now -= nums[i];
} else {//不可以选
used[i] = false;//不选它
}
}
}
}
int main() {
freopen("data.in", "r", stdin);
while(scanf("%d %d", &sum, &n) == 2 && sum && n) {
for(int i = 0; i < n; ++i) {
scanf("%d", &nums[i]);
}
sort(nums, nums+n, cmp);
ok = false;
memset(used, false, sizeof(used));
memset(ans, -1, sizeof(ans));
len = 0;
dfs(0, 0);
if(!ok) {
printf("Sums of %d:\n", sum);
printf("NONE\n");
}
}
return 0;
}