题意:将num切开然后求和,找到一个小于等于t且最接近t的值,如果得到这个值的方法是唯一的则输出切num的方法,否则输出rejected。如果没有一个方法的数是小于等于t则输出error。
题记:dfs去搜索所有切的方法。注意记录切的路径。
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N = 1e6;
int t;
char num[7];
int vis[N];
int sum, p, path, ans;
int getvalue(char* s, int k) {
int res = 0;
for (int i = 0; i < k; i++) {
res *= 10;
res += s[i] - '0';
}
return res;
}
void dfs(char* s, int len) {
if (len == 0) {
vis[sum]++;
//cout << sum << ' ' << p << endl;
if (ans <= sum && sum <= t) {
ans = sum;
path = p;
}
}
//cout<<s<<' '<<len<<endl;
for (int i = 1; i <= len; i++) {
int a = getvalue(s, i);
sum += a;
if (sum > t) {
sum -= a;
continue;
}
p = p * 10 + i;
char b[7];
int j = 0;
for (int k = i; k < len; k++)
b[j++] = s[k];
b[j] = '\0';
dfs(b, len - i);
sum -= a;
p /= 10;
}
return;
}
int main() {
while (cin >> t >> num) {
int len = strlen(num);
if (t == 0 && len == 1 && num[0] == '0') break;
memset(vis, false, sizeof(vis));
int n = len;
ans = 0, sum = 0, p = 0;
for (int i = 0; i < len; i++)
ans += num[i] - '0';
if (ans > t) {
cout << "error" << endl;
continue;
}
dfs(num, len);
if (vis[ans] > 1) {
cout << "rejected" << endl;
}
else if (vis[ans] == 1) {
string str = "";
int i = len - 1;
cout << ans;
//cout << path << endl;
while (path) {
int u = path % 10;
for (; i >= 0 && u; i--, u--)str += num[i];
str += ' ';
path /= 10;
}
//cout << str << endl;
reverse(str.begin(), str.end());
cout << str << endl;
}
}
return 0;
}