HDU 1028 Ignatius and the Princess III(递推或母函数)

参考博客:链接

题面:链接

题目大意:将一个正整数n,分解为若干个正整数之和,求分解方法的数目。

思路:由于n较小,且分解的方法数目一定,可以选择先打表,后直接出处即可。
打表过程先看题目给出的例子:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
由题目中的例子知:
可设dp(a,k)表示将一个数a用不大于k的数划分的方法(1<=k<=n);
就从k开始,先分掉一个k,分解方法为:dp(a-k, k);
紧接着,可以从k’=k-1开始,分解方法为: dp(a,k-1);
a-k=0时结果为1,a小于k时,dp(a,k)为dp(a,a);
则递推式即:dp(a,k)=dp(a-k,k)+dp(a,k-1);

   注意:初始状态 a=1、k=1时,分解结果唯一,当
    a<k,结果也是唯一的,都为1。

ac代码:

#include<stdio.h>
#define ll long long//分解方法数目小,不会超

int dp[121][121];
void Play_table()//打表,记录数字n的拆分方法
{
    int i,j;
    for(i=1; i<=120; i++)
        {
            dp[1][i]=dp[i][1]=dp[0][i]=1;
        }
    for(i=2; i<=120; i++)
        {
            for(j=2; j<=120; j++)
                {
                    dp[i][j]=i>=j?
                             dp[i-j][j]+dp[i][j-1]:dp[i][i];//!!
                }
        }
}

int main()
{
    int n;
    Play_table();
    while(~scanf("%d",&n))
        {
            if(n<1||n>120) break;
            printf("%d\n",dp[n][n]);
        }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值