#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每日推薦——碎紙機
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.