zoukankan      html  css  js  c++  java
  • 【4006】自然数的拆分问题

    Time Limit: 10 second
    Memory Limit: 20 MB

    任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。

    Input

    输入文件仅一行,输入一个自然数n(1≤n)。

    Output

    输出若干个数的加法式子(如下)。
    要求每行的元素按序输出,左边的元素不大于右边的元素,行末用换行结束。

    Sample Input

    7
    
    

    Sample Output

    1+1+1+1+1+1+1
    1+1+1+1+1+2
    1+1+1+1+3
    1+1+1+2+2
    1+1+1+4
    1+1+2+3
    1+1+5
    1+2+2+2
    1+2+4
    1+3+3
    1+6
    2+2+3
    2+5
    3+4
    

    【题解】

    同样是dfs,一直加就好。超过输入的数字剪掉。

    【代码】

    #include <cstdio>
    
    int n,sum = 0,a[32788],number = 0;
    
    void input_data() //输入数据	 
    {
        scanf("%d",&n);
    }
    
    void search(int t) //dfs 
    {
        sum+=t; //加上当前搜索到的数字 
        if (sum > n) //如果超过了所需要的和就剪掉 
        	{
        		sum-=t; //不能忘了回溯,因为sum是写在Int main 前面的数据 
    			return;	
        	}
        a[++number] = t; //记录下当前搜索到的数字 
        for (int i = t;i <= n;i++) //从当前数字开始搜,题目要求左边的数字不大于右边的数字 
        	search(i);
        if (sum == n) //如果满足了n的要求,就输出算式 
        	{
        	    for (int i = 1;i <= number-1;i++)
    			    printf("%d+",a[i]);
    			printf("%d
    ",a[number]);
        	}
        number--; //回溯搜索这个数字之前的状态。 
        sum-=t;
    }
    
    void get_ans()
    {
        for (int i = 1;i <= n/2;i++) //假设 n=100,则超过了100/2 == 50 就没有意义,51+51>100 
    		search(i);	
    }
    
    int main()
    {
        input_data();
        if (n == 1)  //特判一下n = 1 的情况。 
    	    printf("1
    ");
    		    else
    			    get_ans();
        return 0;	
    }
    


     

  • 相关阅读:
    linux screen 命令详解
    centos7 安装docker(手动和脚本安装)换源 卸载
    在linux上安装taiga
    阿里云清除云盾
    Vim
    推荐 130 个令你眼前一亮的网站,总有一个用得着
    索引优化分析 2
    Mysql的主存复制 5
    Mysql锁机制 4
    查询获取分析 3
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632494.html
Copyright © 2011-2022 走看看