【4006】自然数的拆分问题

来源:互联网 发布:乐视超级电视要用网络 编辑:程序博客网 时间:2024/06/05 17:15

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+11+1+1+1+1+21+1+1+1+31+1+1+2+21+1+1+41+1+2+31+1+51+2+2+21+2+41+3+31+62+2+32+53+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;}


 

0 0
原创粉丝点击