整数的所有不同分割数目
来源:互联网 发布:四川省广电网络 编辑:程序博客网 时间:2024/04/29 12:30
问题描述:把一个正整数写成若干个正整数的和。比如4=3+1,2+2,2+1+1,1+1+1+1,再加上自己,就一共有5种分割方式。
思路:求解4的所有分割方式,实际上就是求分割中以4为最大值而且和为4的所有分割方式,可以用p[4][4]来表示。抽象出来,就是p[n][m],表示分割中以m为最大值而且和为n的所有分割方式。那么,就有以下几种情况。
1.第一步当然是n==m,所以第一个分割肯定是n本身了。最大值为n的分割肯定只有一个,所以接下来,就要求p[n][m-1]了。归纳出来:p[n][m]=p[n][m-1]+1;
2.从第一步m-1后,n肯定是大于m了。所以,p[n][m]的分割中,要么不含m,比如p[4][2],4可以分割成1+1+1+1,这就不含2。这样的话最大值就是1,也就是m-1,所以这种情况归纳出来就是p[n][m-1];要么 含一个或以上m,比如2+2,这样的话p[n][m]=p[n-m][m],或者p[n-2m][m]......因为剔除掉若干个m,数目是一样的。
3.通过以上分析,可以很明显的看出这个程序可以用递归写出来。写递归,关键的一点就是递归结束的条件。在这里比较简单,就是p[n][1]=1,p[1][m]=1了。还要注意,n<m没什么意义,所以这里把n<m时的p[n][m]直接定义成p[n][n];
归纳一下,递归的详细步骤如下:
1.n==1 || m==1 p[n][m]=1
2.n==m p[n][n]=p[n][m-1]+1
3.n>m p[n][m]=p[n][m-1]+p[n-m][m]
4.n<m p[n][m]=p[n][n]
代码如下:
1 #include <stdio.h> 2 #define MAX 1000 3 4 int p[MAX][MAX]={0}; 5 6 //prototype 7 int process(int n,int m); 8 9 int main()10 {11 int n=4; 12 int result=process(n,n);13 result=p[n][n];14 printf("%d\n",result);15 return 0;16 17 }18 19 int process(int n,int m)20 {21 if(n==1 || m==1) //p(n,1)=1,p(1,n)=1.22 return (p[n][m]=1);23 if(n<m)//when n is less than m,let m=n.24 return (p[n][m]=process(n,n));25 if(p[n][m]!=0)26 return p[n][m];27 if(n==m)28 return (p[n][m]=1+process(n,m-1));29 return (p[n][m]=process(n,m-1)+process(n-m,m));30 }
参考资料:《C语言精选名题百则技巧篇》
如果你觉得我的文章对你有帮助,请推荐一下,非常感谢!
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 整数的所有不同分割数目
- 整数的所有不同分割数目
- 整数的所有不同分割数目--非递归算法
- 整数的所有分割数目
- 整数的所有不同分割数目----2013年2月15日
- 整数的分割数目
- 整数分割数目
- 整数不同分割方式
- 求分割的数目
- 用户输入一串整数和任意数目的空格,程序自动对所有的整数进行求和
- 整数的分割方式
- 集合的所有分割
- C++如何读取任意数目的整数
- 网络教室 树上不同直径的数目
- 计算不同引用次数的专利数目
- gridView获取所有item的数目
- 整数的所有因子
- 给定一组不同的整数,S返回所有可能的子集。
- UVA 10783 - Odd Sum
- C++第14周项目1 - 动物怎么叫
- 详解基于STM32的keil4 MDK 软件仿真输出IO口的波形图!
- 【前端插件】弹窗插件的编写【一】---编写一个窗体蓝本
- STC89C52串口的复用
- 整数的所有不同分割数目
- 毕业求职
- 世纪末的星期
- java 线程同步
- HDU-2046骨牌铺方格
- busybox源码剖析(1)
- 【JAX-WS入门系列】第08章_与Spring集成以及获取ServletAPI
- c++ 学习之2
- 状态压缩dp学习小记part1