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