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; }