nyoj 279 队花的烦恼2

描述

ACM队队花C小+最近在X大OJ上做题,竟发现了一道做不出来的…水题!她快郁闷死了……也许是最近状态不太好吧……她希望大家能帮帮忙:把一个整数分成若干个不为零的整数,问有多少种不同分法。

例:7 3 其中的分法:1 1 5,1 5 1,5 1 1是同一种分法。

输入
有多组测试数据
每组数据都有两个整数n,m(6<=n<=500,2<=m<=6)
n表示该整数,m表示把n分成m份
输出
对每一组测试数据,输出不同的分法数
样例输入
7 3
10 2
20 3
样例输出
4
5
33

可以用DP,也可以用递归。
DP的效率更高一些。因为dp数组中已经存放了之前算出来的把n分成m个有几种分法的数值,再次测试的时候不用重新算了。
相当于把n个苹果放到m个盘子里有几种分法。dp[n][m] = dp[n-1][m-1]+dp[n-m][m]。什么意思呢?就是把n个苹果放到m个盘子里并且保持每个盘子都不为空,所以相当于两种放法的相加:1.只有一个盘子里有一个苹果,这时候就是把n-1个苹果放到m-1个盘子里。2.每个盘子里的苹果数都大于一个,这时候相当于每个盘子里都事先装好了一个,只分剩下的n-m个就可以了。


#include
#include

int dp[505][7];
int main()
{
    int n, m, x, y;
    while(scanf("%d %d", &x, &y) != EOF)
    {                                                                               //每次开始前不用将dp初始化。不管测试数据为何,把n个数分成m份的分法数是一定的。可以提高效率。
        for(n = 1 ; n <= x ; n++)
            for(m = 1 ; m <= y ; m++)
        {
            if(n < m)
            dp[n][m] = 0;
        else if(m == 1 || n == m)
            dp[n][m] = 1;
        else
            dp[n][m] = dp[n-1][m-1] + dp[n-m][m];
        }
        printf("%d\n", dp[x][y]);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值