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/lj-vs-lishimin/archive/2012/07/02/2774388.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值