2016暑期集训---搜索(整数拆分)

Placing apples

Description
We are going to place M same apples into N same plates.
There could be some empty plates.
How many methods do we have?
When we have 7 applesand 3 plates, the methods, (1, 5, 1) and (5, 1, 1) are the same.
Input
The first line is the number of test cases, t. 0<=t<=20
The next t lines are test cases containing two numbers, M and N. 1<=M, N<=10.
Output
Output the numbers of method in each test case in one line.

Sample Input
1
7 3
Sample Output
8

都不好意思说自己上过组合数学了,而且上个学期刚上过,结果现在只是书中的一个简单模型都解不出来了,OTL,上次在电梯遇见jxp还夸我组合数学考得好,ORZ,考完之后整本书的东西全忘了
【题目大意】给定m个无区别的苹果和n个无区别的盘子,允许盘子为空,求问有几种放置的方法
【解法】m个无区别的苹果和n个无区别的盘子,允许盘子为空。对应的球盒模型是n个无区别小球,m个无区别盒子,允许盒子为空的情况。跟整数拆分的解法是一样的。
由于已经忘记了整数拆分的求法,而且推了半天也没推出来,所以就搜了整数拆分的相关资料,碰见了一篇觉得写得蛮不错的博客,OTL,至少在看完博主的推导之后,我再自己写,总算了写出了正确的算法,不过不知道这次会记住多久。ORZ
http://blog.youkuaiyun.com/pi9nc/article/details/8142091
【AC代码】:

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int split(int m, int n){
    if(m == 1 || n == 1){
        return 1;
    }
    if(n > m){
        return split(m,m);
    }
    if(n == m){
        return 1 + split(m, n - 1);
    }
    if(n < m){
        return split(m - n, n) + split(m, n - 1);
    }
}

int main(){
    int t, m, n;
    scanf("%d", &t);
    while(t--){
        scanf("%d%d", &m, &n);
        printf("%d\n", split(m, n));

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值