【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
- 【4006】自然数的拆分问题
- 【课件】自然数的拆分问题
- (c)自然数的拆分问题(回溯 递归)
- 自然数的拆分问题(递归)
- 自然数拆分问题
- 自然数的所有拆分
- Tyvj 1172 自然数的拆分
- Project 7:自然数的拆分
- 自然数的拆分组数
- TOJ 3104 自然数的拆分
- 栈练习自然数的拆分
- SDUT 1263 自然数的拆分
- 自然数拆分
- 自然数拆分。
- 拆分自然数
- 自然数拆分
- 自然数拆分
- 自然数拆分
- iOS开发——创建你自己的Framework
- VxWorks中Timer机制
- java之null
- VMware虚拟机克隆Linux系统后找不到eth0网卡的问题
- sqlserver查询数据库中有多少个表
- 【4006】自然数的拆分问题
- 你会用sizeof吗?(vc篇)
- spark性能调优:资源优化
- mongodb监控工具介绍
- 第一篇博客-测试
- oracle建表空间、用户
- NDK图形函数在某些机型下显示花屏的问题
- C语言变参函数的实现 参考代码
- VC虚拟键值(VK)