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