#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int ans,num,m,vis[1000005],now[100],step[100],n;
char s[100];
void dfs(int pos,int sum,int cnt)//当前位置,当前的和,每一种方案的编号(次数)
{
if(pos >= m)//保证方案合法后
{
vis[sum] ++;//和为sum的方案数++
if(sum > ans)//更新
{
ans = sum;
num = cnt;//cnt赋给num,因为返回方案后,cnt回到上一个值
for(int i = 0; i < cnt; i ++)
step[i] = now[i];//原理同上,now数组会变
}
return ;//返回方案
}
int t = 0;
for(int i = pos ; i < m; i ++)
{
t = t*10+s[i]-'0';//从前往后的每一位数,依次增加 像123456 >>>1 12 123 1234 12345 123456
if(sum + t > n)//判断合法性
return ;
now[cnt] = t;//把当前搜到的划分出来的数,赋给编号为cnt的now数组里,now数组就存下一种方案的每步的划分
dfs(i+1,sum+t,cnt+1);//继续搜
}
}
int main()
{
int sum;
while(scanf("%d%s",&n,s) != EOF )
{
m = strlen(s);
if(m == 1 && n == 0 && s[0] == '0')
break;
sum = 0;
for(int i = 0; i < m; i ++)
sum +=s[i]-'0';
if(sum > n)//如果最小和大于n
{
puts("error");//直接输出错误
continue;//注意这个地方,一定要加continue,sum>n后就程序就不能再往下了,否则会多输出错误答案,continue用来继续while循环,也就是下一组数
}
ans = num = 0;
memset(vis,0,sizeof(vis));
dfs(0,0,0);//开始搜索
if(vis[ans] > 1)//如果方案数大于1
puts("rejected");
else
{
printf("%d",ans);
for(int i = 0; i < num; i ++)
printf(" %d",step[i]);//输出最优的方案数中每一个划分出的数
puts("");
}
}
return 0;
}
openjudge每日推荐——碎纸机
最新推荐文章于 2017-10-11 16:52:49 发布