这道题就是搜索,大家懂的! #include<stdio.h> #include<string.h> char str[7]; int numlist[7],list[7],n,sum,len,flag1,flag2,level; int StrToInt(char *str,int len) //字符串转整型 { int i,sum = 0; for(i = 0;i < len-1;i++) sum = (sum + str[i]-'0')*10; sum+=str[len-1]-'0'; return sum; } void shred(int num,int i,int level) //深搜 { int j,a,k; if(i>=len) { if( (n-num) < sum) { sum = n -num; for(k = 0;k < 7;k++) list[k] = numlist[k]; flag1 = 1; flag2 = 0; } else if((n-num)==sum) flag2 = 1; //有相同解 return; } for(j = 0;i+j<len && (a = StrToInt(str+i,j+1)) < n && j<len && ((a+num) <= n);j++) { for(k = level;k < 7;k++) numlist[k] = -1; numlist[level] = a; shred(a+num,i+j+1,level+1); } } int main() { int i,j; while(scanf("%d",&n)) { getchar(); scanf("%s",str); if(n==0&&str[0]=='0') break; len = strlen(str); if(n == StrToInt(str,len)) { printf("%d %d/n",n,n); continue; } else { sum = 1<<30; flag1 = flag2 = 0; //作为标志 shred(0,0,0); } if(flag1&&!flag2) { printf("%d ",n-sum); for(i = 0;list[i]!=-1;i++){} for(j = 0;j < i-1;j++) printf("%d ",list[j]); printf("%d/n",list[i-1]); } else if(flag1 && flag2) printf("rejected/n"); else if(!flag1) printf("error/n"); } return 0; }