POJ 1416

来源:互联网 发布:linux oracle查看实例 编辑:程序博客网 时间:2024/05/01 22:39

本题目的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;}


 

原创粉丝点击