本题目的dfs原理不难,个人认为难点式路径的记录,刚开始定义了很大的数组,提交的时候超出了内存的限制,后来在网上发现有的人用了栈存储,纠结了半天终于搞出来啦。
#include <stdio.h> #include <string.h> int flag; int st[7]; int head; int in[6]; int digit; int digit2; int num1,max; int de; void dfs(int cur,int sum) { if(cur>=digit2) { if(sum>max) { max=sum; flag=1; head=0; st[head++]=cur; de=cur; } else if(sum==max) flag=2; return; } int i,j; for(i=1;i<=digit2;i++)//当前区间包含的位数 { if((cur+i)>digit2) break; int asum=0; for(j=0;j<i;j++) { asum=asum*10+in[cur+j]; } if((sum+asum)>num1) return; dfs(cur+i,sum+asum); if(cur<de)//存储路径 { de=cur; st[head++]=de; } } } void printPath(int tem) { int i,j; for(i=head-2;i>=0;i--) { printf(" "); for(j=st[i+1];j<st[i];j++) { printf("%d",in[j]); } } } int main() { char s[7]; while(scanf("%d %s",&num1,&s)) { if(!num1&&s[0]=='0') break; flag=digit=digit2=0; de=max=-1; int tem[6]; int t=num1; while(t) { digit++; t/=10; } digit2=strlen(s); for(int i=0;i<digit2;i++) { in[i]=s[i]-'0'; } dfs(0,0); if(!flag) printf("error\n"); else { if(flag==2) printf("rejected\n"); else if(flag==1) { printf("%d",max); printPath(max); printf("\n"); } } } return 0; }