题目链接:http://poj.org/problem?id=1950
题意:n个数字中间添加若干个+或-,使得式子运算结果为0。
枚举位置以及符号即可,注意有可能出现10 11之类的数字,比如这两个数字组合起来会是1011。所以要特别考虑两位数时的组合,即原数*100再加新的数。
还要默认0 1之间是+,否则会多解。
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <cassert> 8 #include <cstdio> 9 #include <bitset> 10 #include <vector> 11 #include <deque> 12 #include <queue> 13 #include <stack> 14 #include <ctime> 15 #include <set> 16 #include <map> 17 #include <cmath> 18 using namespace std; 19 20 const int maxn = 16; 21 int n, tot; 22 int m; 23 char tmp[maxn*5]; 24 char opt[maxn*5]; 25 26 void dfs(int pos, int pre, int sum) { 27 if(pos == n) { 28 if(sum != 0) return; 29 if(tot < 20) { 30 for(int i = 1; i < n; i++) printf("%d %c ", i, opt[i]); 31 printf("%d ", n); 32 } 33 tot++; 34 return; 35 } 36 opt[pos] = '+'; dfs(pos+1, pos+1, sum+pos+1); 37 opt[pos] = '-'; dfs(pos+1, pos+1, sum-pos-1); 38 opt[pos] = '.'; 39 int cur = pos - 1; 40 while(opt[cur] == '.' && cur >= 0) cur--; 41 if(pos < 9) { 42 if(opt[cur] == '+') dfs(pos+1, pre*10+pos+1, sum+(pre*10+pos+1-pre)); 43 else dfs(pos+1, pre*10+pos+1, sum-(pre*10+pos+1-pre)); 44 } 45 else { 46 if(opt[cur] == '+') dfs(pos+1, pre*100+pos+1, sum+(pre*100+pos+1-pre)); 47 else dfs(pos+1, pre*100+pos+1, sum-(pre*100+pos+1-pre)); 48 } 49 } 50 51 int main() { 52 // freopen("in", "r", stdin); 53 while(~scanf("%d", &n)) { 54 tot = 0; m = 0; 55 memset(tmp, 0, sizeof(tmp)); 56 memset(opt, 0, sizeof(opt)); 57 opt[0] = '+'; 58 dfs(1, 1, 1); 59 cout << tot << endl; 60 } 61 return 0; 62 }