nyoj 571 整数划分(三)(递归)

来源:互联网 发布:windows java进程监控 编辑:程序博客网 时间:2024/05/18 02:05

整数划分(三)

描述
整数划分是一个经典的问题。请写一个程序,完成以下要求。

输入
每组输入是两个整数n和k。(1 <= n <= 50, 1 <= k <= n)
输出
对于输入的 n,k;
第一行: 将n划分成若干正整数之和的划分数。
第二行: 将n划分成k个正整数之和的划分数。
第三行: 将n划分成最大数不超过k的划分数。
第四行: 将n划分成若干个 奇正整数之和的划分数。
第五行: 将n划分成若干不同整数之和的划分数。
第六行: 打印一个空行
样例输入
5 2
样例输出
7
2
3
3
3
提示
样例输出提示:
1.将5划分成若干正整数之和的划分为: 5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
2.将5划分成2个正整数之和的划分为: 3+2, 4+1
3.将5划分成最大数不超过2的划分为: 1+1+1+1+1, 1+1+1+2, 1+2+2
4.将5划分成若干 奇正整数之和的划分为: 5, 1+1+3, 1+1+1+1+1
5.将5划分成若干不同整数之和的划分为: 5, 1+4, 2+3


思路:
1.将n划分成若干个正整数之和(m表示为当前划分的最大值)

当n=1时,不论m的值为多少(m>0),只有一种划分即{1}; 当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,...,1}; 当n<m时,由于最大值只能是n,所以此时f(n,m)=f(n,n);当n=m时,根据划分中是否包含n,可以分为两种情况:    (1) 划分中包含n的情况,只有一个即{n};     (2) 划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。因此 f(n,n) =1 + f(n,n-1); 当n>m时,根据划分中是否包含最大值m,可以分为两种情况:     (1) 划分中包含m的情况,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi} 的和为n-m,可能再次出现m,因此是(n-m)的m划分,因此这种划分个数为f(n-m, m);     (2) 划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1);因此 f(n, m) = f(n-m, m)+f(n,m-1);

2.将n划分成m个正整数之和

首先当m=1时,f(n,m)=1;当n<m时,f(n,m)=0;然后根据划分的m个整数中是否包含1,可以分为两种情况:  (1)假设分成的m个整数中不包含1,那么 此时 f (n-m,m)就是这部分的总情况,因为既然让它不包含1,就先将m个整数都分出1,此时n变为n-m,再将n分为m个整数,这m个整数再加上原先分出的1,就肯定不含1了。  (2)假设分成的m个整数至少有一个1,那么此时f(n-1,m-1)因此f(n,m)=f(n-m,m)+f(n-1,m-1);

3.将n划分成最大数不超过m(同1)

4.将n划分成若干奇正整数之和

将n划分成若干个正整数之和的改进版我们首先需要调整边界状态:当m=1时,f(n,m)=1;当n=1而m>1时,f(n,m)=0其次,我们需要调整状态转换公式:f(n-m,m)+f(n,m-1); (n>m) 应该更改为:f(n-m,m)+f(n,m-2); (n>m)这是因为我们不能取偶数,故而当m为奇数的时候,m-1为偶数(只能被选择0次),f(n,m-1)=f(n,m-2);

5.将n划分成若干不同正整数之和

将n划分成若干个正整数之和的改进版此时我们需要调整我们的状态转换公式。f(n-m,m)+f(n,m-1); (n>m) 应该更改为:f(n-m,m-1)+f(n,m-1); (n>m)为什么呢?因为每个数最多使用一次,f(n-m,m-1)表示我们取了数m,f(n,m-1)表示我们没取,但是无论取不取数m我们以后都不会再次取数m了。当然,我们还需要调整边界状态:当m=1时,f(n,m)=1;当n=1而m>1时,f(n,m)=0。其他不变!

代码:

#include<stdio.h>const int N=50;const int maxn=55;int dp1[maxn][maxn],dp2[maxn][maxn],dp3[maxn][maxn],dp4[maxn][maxn];void init(){//将n划分成若干个正整数之和(将n划分成最大数不超过m)    dp1[0][0]=1;    for(int i=0; i<=N; ++i)        for(int j=1; j<=N; ++j)        {            if(j>i)                dp1[i][j]=dp1[i][i];            else                dp1[i][j]=dp1[i][j-1]+dp1[i-j][j];        }//将n划分成m个正整数之和    dp2[0][0]=1;    for(int i=1; i<=N; ++i)        dp2[i][1]=1;    for(int i=2; i<=N; ++i)        for(int j=2; j<=i; ++j)            dp2[i][j]=dp2[i-1][j-1]+dp2[i-j][j];//将n划分成若干奇正整数之和    for(int i=1; i<=N; ++i)        dp3[i][1]=1;    for(int i=1; i<=N; ++i)        dp3[0][i]=1;    dp3[0][0]=1;    for(int i=1; i<=N; ++i)        for(int j=2; j<=N; ++j)        {            if(j&1)            {                if(j>i)                {                    if(i&1)                        dp3[i][j]=dp3[i][i];                    else                        dp3[i][j]=dp3[i][i-1];                }                else                    dp3[i][j]=dp3[i-j][j]+dp3[i][j-2];            }            else dp3[i][j]=dp3[i][j-1];        }//将n划分成若干不同正整数之和    for(int i=1; i<=N; ++i)    {        dp4[0][i]=1;        dp4[1][i]=1;    }    for(int i=2; i<=N; ++i)        for(int j=1; j<=N; ++j)        {            if(j>i)                dp4[i][j]=dp4[i][i];            else                dp4[i][j]=dp4[i-j][j-1]+dp4[i][j-1];        }}int main(){    init();    int n,k;    while(~scanf("%d%d",&n,&k))    {        printf("%d\n",dp1[n][n]);        printf("%d\n",dp2[n][k]);        printf("%d\n",dp1[n][k]);        printf("%d\n",dp3[n][n]);        printf("%d\n\n",dp4[n][n]);    }    return 0;}

参考博客:
isiqi
苯苯的小木屋

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 欧联杯冠军已经获得欧冠资格怎么办 孩子该上学了学校不收怎么办 帮室友带东西她忘给钱怎么办? 鸿合录播系统不会自动跟踪了怎么办 小米2s锁屏密码忘了怎么办 想用中国驾照去美国开车怎么办? 5座的车坐7个人怎么办 海尔电视机的设置调乱了怎么办 老公弟兄两个有个偏心的婆婆怎么办 农商银行u盾密码忘了怎么办 不熟的表弟表妹向你借钱怎么办 开货车撞到人家房子了怎么办 坐骨被摔跤后好多年没好怎么办 自动挡汽车电子手刹刹车失灵怎么办 买家拍了不包邮的宝贝付款了怎么办 包邮快递买家不要了运费怎么办 舞蹈劈叉练出肌肉劈不下去怎么办 腰间盘突出压迫神经腿疼怎么办盘 绑定了我身份证的微信被盗了怎么办 用身份证办的手机卡不用了怎么办 平安陆金所交易密码忘了怎么办 陆金所密码交易密码忘记怎么办 带介指手指月肿了拿不下来怎么办 老公搞建筑的要长期在外地怎么办 媳妇跟婆婆吵架老公帮婆婆该怎么办 在家里礼佛香炉剩下的香头怎么办 精索曲张最近一打篮球就蛋疼怎么办 都两天了快递还是显示已发货怎么办 中通快递到达一天就是不派送怎么办 顺丰派送员把快递寄错了怎么办 顺丰快递把户籍卡弄丢了怎么办 金立手机不小心设置成英文了怎么办 三星手机不小心设置成英文了怎么办 手游方舟国际版渡渡鸟跟丢了怎么办 一打电话4g变2g怎么办 手机4g突然变2g怎么办 江湖风云录八卦门任务拒绝了怎么办 百度网盘下载时显示违规信息怎么办 在海马助手下载的游戏闪退怎么办 手机版百度云盘不能普通下载怎么办 手机版百度云盘一直加载中怎么办