整数的所有不同分割数目----2013年2月15日

简介:
  问题描述:把一个正整数写成若干个正整数的和。比如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 }
 本文转自NeilHappy 51CTO博客,原文链接:http://blog.51cto.com/neilhappy/1133840,如需转载请自行联系原作者
相关文章
|
2月前
|
算法
算法题 — 整数转二进制,查找其中1的数量
算法题 — 整数转二进制,查找其中1的数量
12 0
|
3月前
输入3个数a,b,c,按大小顺序输出
输入3个数a,b,c,按大小顺序输出。
42 15
|
4月前
输入一个字符串,统计其中字符A的数量并且输出,输入共有一行,为一个不带空格的字符串(其中字符数不超过100),输出一行,包含一个整数,为输入字符串中的A的数量
输入一个字符串,统计其中字符A的数量并且输出,输入共有一行,为一个不带空格的字符串(其中字符数不超过100),输出一行,包含一个整数,为输入字符串中的A的数量
|
6月前
abc序列数
abc序列数
27 0
|
9月前
输入2个数,计算这2个数的,和商积差余,
输入2个数,计算这2个数的,和商积差余,
52 0
|
Serverless C++
C/C++编程题之字符个数统计
C/C++编程题之字符个数统计
多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
104 0
多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
统计二进制中1的个数,,,写一个函数,返回参数二进制中1的个数 写一个代码判断一个数字是不是2的n次方
统计二进制中1的个数,,,写一个函数,返回参数二进制中1的个数 写一个代码判断一个数字是不是2的n次方
101 0
|
缓存 C语言
练习12—统计特定字符个数
练习12—统计特定字符个数
输出2000-3000之间所有十位数是m且是n的倍数的数的个数
输出2000-3000之间所有十位数是m且是n的倍数的数的个数
97 0