zoukankan      html  css  js  c++  java
  • 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;
    }


     

  • 相关阅读:
    两数之和
    dict用法
    xgboost
    常见报错
    四、ABP 学习系列
    Apache Htpasswd生成和验证密码
    ABP 学习系列
    Gradle 配置
    ArcGis教程
    在线排程设置生成器Quartz
  • 原文地址:https://www.cnblogs.com/lj030/p/3002320.html
Copyright © 2011-2022 走看看