【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\n",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\n");
		    else
			    get_ans();
    return 0;	
}


 

posted @ 2017-10-06 19:23  AWCXV  阅读(232)  评论(0编辑  收藏  举报