通过重新拆分、组合(顺序不变),得到小于给定数的最大值及其组合
Sample Input | Sample Output |
50 12346 | 43 1 2 34 6 |
376 144139 | 283 144 139 |
927438 927438 | 927438 927438 |
18 3312 | 18 3 3 12 |
9 3142 | error |
25 1299 | 21 1 2 9 9 |
111 33333 | rejected |
103 862150 | 103 86 2 15 0 |
6 1104 | rejected |
0 0 |
#include<stdio.h>
#include<string.h>
int max=0,num1[7],num2[7],flag,n;
int char_int(char str[]){
int b=0;
char *c=str;
while(*c!=0){
b=b*10+(*c-48);
c++;
}
return b;
}
//DFS
void DFS(char *p,int s,int i,int num){
int x=0;
if(*p==0){
int j;
if(s>max){
flag=1;
max=s;
num2[0]=num;
for(j=1;j<i;j++)
num2[j]=num1[j];
}
else{
if(s==max)
flag=0;
}
return ;
}
while(*p!=0){
x=x*10+(*p-48);
if(s+x>n) return;
num1[i]=x;
DFS(p+1,s+x,i+1,num+1);
p++;
}
}
int main(){
char c[7];
int m,i;
while(scanf("%d%s",&n,c),n+(m=char_int(c))!=0){
if(n==0) printf("error\n");
else{
if(m==0) printf("0 0\n");
else{
max=0;
flag=1;
DFS(c,0,1,0);
if(!max){
printf("error\n");
continue;
}
if(flag){
printf("%d",max);
for(i=1;i<=num2[0];i++)
printf(" %d",num2[i]);
printf("\n");
}
else
printf("rejected\n");
}
}
}
return 0;
}