POJ 1416

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


 

原文地址:https://www.cnblogs.com/lj030/p/3002320.html