思路:
搜索。
实现:
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <algorithm> 5 #include <cstring> 6 using namespace std; 7 8 const int INF = 0x3f3f3f3f; 9 10 vector<int> num; 11 int n, x, y, maxn, ansn; 12 bool split[10]; 13 int ans[10], buf[10], cnt_m = 0; 14 15 void dfs(int now, bool f) 16 { 17 if (now == n) 18 { 19 int sum = 0; 20 split[n - 1] = true; 21 int cnt = 0, t = 0; 22 for (int i = 0; i < n; i++) 23 { 24 cnt += num[i]; 25 if (split[i]) 26 { 27 sum += cnt; 28 buf[t++] = cnt; 29 cnt = 0; 30 } 31 else 32 cnt *= 10; 33 } 34 if (sum <= x) 35 { 36 if (sum > maxn) 37 { 38 maxn = sum; 39 ansn = t; 40 for (int i = 0; i < ansn; i++) 41 { 42 ans[i] = buf[i]; 43 } 44 } 45 else if (sum == maxn && f) 46 { 47 cnt_m++; 48 } 49 } 50 return; 51 } 52 split[now] = true; 53 dfs(now + 1, f); 54 split[now] = false; 55 dfs(now + 1, f); 56 } 57 58 int main() 59 { 60 //freopen("C:\users\wangyiming\Desktop\in.txt", "r", stdin); 61 while (cin >> x >> y, x || y) 62 { 63 num.clear(); 64 maxn = -INF; 65 cnt_m = 0; 66 memset(split, 0, sizeof(split)); 67 while (y) 68 { 69 num.push_back(y % 10); 70 y /= 10; 71 } 72 n = num.size(); 73 reverse(num.begin(), num.end()); 74 dfs(0, false); 75 dfs(0, true); 76 if (cnt_m > 2) puts("rejected"); 77 else if (maxn != -INF) 78 { 79 cout << maxn << " "; 80 for (int i = 0; i < ansn; i++) 81 { 82 cout << ans[i] << " "; 83 } 84 cout << endl; 85 } 86 else puts("error"); 87 } 88 return 0; 89 }