这里设置一个flag来记录发生了什么情况,0表示error,1表示正常,2表示拒绝。
逻辑主要如下:
如果和大于当前res并且小于target,那么更新值,记录所有分割情况,标记flag为1,接受
如果和等于当前res,标记flag为2,即拒绝
如果dfs的过程中没有改变flag,即flag为0,那么说明没有比target小的值,error
代码如下所示:
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<list>
#include<vector>
#include<string>
#include<iostream>
#include<ctime>
#include <cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define ll long long
ll t;
char s[7];
int len, lent;
int res;
int flag;
int target[7];
int ans[7];
void DFS(int i, int time, ll sum){
if (sum>t){
return;
}
if (i>=len){
if (sum>res){
flag=1;
lent=time;
res=sum;
for (int j = 0; j < time; ++j) {
ans[j]=target[j];
}
} else if (sum==res){
flag=2;
}
}
ll tmp=0;
for (int j = i; j < len; ++j) {
tmp = tmp*10+s[j]-'0';
target[time]=tmp;
DFS(j+1, time+1,sum+tmp);
}
}
int main() {
while (~scanf("%d %s",&t,s)){
if (t==0 && s[0]=='0'){
break;
}
lent=res=flag=0;
len= strlen(s);
// cout<<t<<","<<s<<endl;
DFS(0, 0, 0);
if (!flag){
printf("error\n");
}else if (flag==2){
printf("rejected\n");
}else{
printf("%d", res);
for (int i = 0; i < lent; ++i) {
printf(" %d",ans[i]);
}
printf("\n");
}
}
return 0;
}