【递归】放苹果

【递归】放苹果

题目描述

楚继光刚把油拿到厨房,老妈又大声喊道:“快去把苹果洗了放到盘子里去。”

楚继光要把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5、1、1和1、5、1 是同一种分法。

输入

第1行为一个整数,表示测试数据的数目(测试数据的数目t(0 ≤ t ≤20),第2行为M和N(M和N,以空格分开。1≤M,N≤10)。

输出

输出有多少种不同分法。

样例输入

1
7 3

样例输出

8
分析:球盒问题的一种;
若当前用了K个盘子,则在K个盘子中各放一个苹果;否则转化为K-1个盘子的问题;
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e6+10;
const int dis[][2]={0,1,-1,0,0,-1,1,0};
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;}
ll dfs(int a,int p)
{
    if(a<=1||p<=1)return 1;
    else if(a<p)return dfs(a,a);
    else return dfs(a-p,p)+dfs(a,p-1);
}
int main()
{
    int i,j,m,n,k,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&m,&n);
        printf("%lld
",dfs(m,n));
    }
    //system("pause");
    return 0;
}
 
原文地址:https://www.cnblogs.com/dyzll/p/5645486.html