英文很长,不过是简单题 #include<iostream> #include<string,h> using namespace std; int target,sheet; bool judge[6]; int part[6]; int mark[6]; int pos,mypos; int sum; //记录分段数相加之和 int k; //记录查找状态 int size;//记录分段数的位数 int count() { int add=0,i; int cut=sheet,n=10; pos=0; for(i=size-2;i>=0;i--) { if(judge[i]) { add+=cut%n; mark[pos++]=cut%n;// cut=cut/n; n=10; } else n=n*10; } add+=cut; mark[pos++]=cut;// return add; } void dfs(int m) { if(m>size-2) { int add=count(); if(add<=target && add>=sum) { if(add==sum) k=0; else { for(int i=0;i<pos;i++) part[i]=mark[i]; sum=add; mypos=pos; k=1; } } } else { judge[m]=1; dfs(m+1); judge[m]=0; dfs(m+1); } } int main() { int cut,i,j; while(cin>>target>>sheet &&target!=0 &&sheet!=0) { memset(judge,0,sizeof(judge)); cut=sheet; for( j=1;j<=6;j++) { cut=cut/10; if(!cut) break; } size=j; k=-1; sum=0; mypos=0; dfs(0); if(k==-1) cout<<"error"<<endl; else if(k==0) cout<<"rejected"<<endl; else { cout<<sum<<" "; for( i=mypos-1;i>0;i--) cout<<part[i]<<" "; cout<<part[i]<<endl; } } return 0; }