poj1664-放苹果-acm解题报告-递推

放苹果
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 31892   Accepted: 20055

Description

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

Input

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

Output

对输入的每组数据M和N,用一行输出相应的K。

Sample Input

1
7 3

Sample Output

8


解题:

qq1454739651  AR/VR开发请联系

/*

    设f(m,n)代表m个苹果放在n个盘子里的方案数,
    讨论的递推结果为:
    m=1 或n=1,那么无论只有一个苹果还是一个盘子,都只有一种方案,即放在任意一个盘子里或所有苹果放在唯一
    一个盘子里。 f(m,n)=1
    m<n,  f(m,n)=f(m,m)
    m=n, 放满只有一种方式,放不满时,如果只有一个盘子不妨,那么等同于f(m,n-1)
         ∴ f(m,n)=1+f(m,n-1)
    m>n, 放满时,可以等同为先从m中取n个,分别放入n个盘子里一盘子一个,然后m-n苹果放入n个盘子,如果不放
         满,那么至少剩一个空盘,等同f(m,n-1)
         ∴ f(m,n)=f(m-n,n)+f(m,n-1)


*/


#include <iostream>
#include <stdio.h>
using namespace std;
int solve(int m,int n){
    if(m==1||n==1)return 1;
    else if(m<n)return solve(m,m);
    else if(m==n)return 1+solve(m,n-1);
    else return solve(m-n,n)+solve(m,n-1);
}
int main()
{
    int t,temp1,temp2;   //输入的组数
    cin>>t;
    for(int i=1;i<=t;i++){
        cin>>temp1>>temp2;
        cout<<solve(temp1,temp2)<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/verylonglongago/article/details/54648806