• [置顶] poj1416数字切割解题报告


    题意:有一段纸片,就是一个不超过7位数的整数,现在给定你一个目标值 aim ,让你去选择把纸片切成几段,然后这个几段的和值 最接近 aim 且不超过 aim,

    分析:

    对于这个纸段,比如一个 四位数的 1234,那么第一你就有以下几种切法:  (1、234)  (1、2、34)  (1、2、3、4) (12、34) ().........那么 对于这么多个情况,我们就想一个不重复 的 有顺序的切割方式.....

    比如我按照切的次数,第一次....我可以把第一个数字切下来,,,,也可以把第一和第二个数字切下来,那么就如下图有:


    那么图中就画出的几个 组合...(1、2、3、4)(1、2、34)(1、23、4)那么可以用一个for循环来处理这个切的过程....然后就按照这个dfs,下面给出代码....

    // 164K 0MS 
    #include<stdio.h>
    #include<string.h>
    
    int aim;
    char shred[7];//要切割的数字,做字符串处理
    
    int max_sum;//最大值次数
    int flag_max;//最大值
    int shred_sum;//切割次数
    int ans[7];//最终结果
    int ans_flag[7];//临时结果保存
    
    void dfs(int x,int num,int y)//这里表示我们从第x 位开始切,当前切得值为num,切的次数为 y
    {
    	if(num > aim) return;//寻找不超过目标的最大...那么超过就直接返回
    	if(x >= strlen(shred))//因为我们从1 开始dfs,那么这里 到刚好 > 的时候就是切出一个答案的时候
    	{
    		if(num > flag_max)//比我们标记的最大值还大就更新
    		{
    			max_sum = 1;
    			flag_max = num;
    			for(int q = 0 ; q < y ; q ++)//这里把ans最终结果先更新
    				ans[q] = ans_flag[q];
    			shred_sum = y;
    		}
    		else if(num == flag_max)
    			max_sum = 2;
    	}
    	int sum = 0;
    	for(int i = x ; i < strlen(shred); i ++) //我们从当前的x 位置 一个一个尝试
    	{
    		sum *= 10;
    		sum += shred[i]-'0'; //那么这里就是对于每一次切得到这个值
    		ans_flag[y] = sum;//   具体的过程,前面有说到的图形解释,后面结合图形有详细说明
    		dfs(i+1,sum+num,y+1);
    	}
    }
    
    int main()
    {
    	int i;
    	int sum1,sum2;
    	while(scanf("%d%s",&aim,shred))
    	{
    		sum1 = sum2 = 0;
    		if(aim+(shred[0]-'0') == 0)
    			break;
    
    		max_sum = shred_sum = 0;
    		flag_max = 0;
    		dfs(0,0,0);
    
    		if(max_sum == 0)
    			printf("error
    ");
    		else if(max_sum > 1)
    			printf("rejected
    ");
    		else
    		{
    			printf("%d",flag_max);
    			for(i = 0 ;i < shred_sum ; i ++)
    				printf(" %d",ans[i]);
    			printf("
    ");
    		}
    	}
    	return 0;
    }


    个人愚昧观点...欢迎指正和讨论;;; 大笑

  • 相关阅读:
    关于BindingSource的ListChange事件
    .Net 中Textbox控件的数据绑定
    Google Chrome OS Open Source Project Announcement
    ajax从基础开始
    如何处理Windows Forms程序中未处理的异常
    Chrome的一个bug? 大家看看
    Extjs学习笔记之二——初识Extjs之Form
    SQLite3简介及在.Net程序中的使用
    Extjs学习笔记之一——初识Extjs之MessageBox
    Extjs学习笔记之三——更多的表单项
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3297245.html
Copyright © 2020-2023  润新知