1664:放苹果

时间限制:

1000ms

内存限制:

65536kB

描述

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

输入

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

输出

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

样例输入

1

7 3

样例输出

8

 //关键点是想象出从低到高的柱状型排列,并分层考虑;注意:允许有的瓶子空着不放
#include<iostream> 
using namespace std; 
int recursion(int apple,int n) 

if(n==1||apple==0)//终止条件,当前层仅1个盘子;或者刚好无苹果(注意,因为apple>=n,这个条件说明当前层的下一层必定是刚好铺满)
     return 1;
if(apple<n ) 
      return recursion(apple,apple);//忽略掉n-apple个盘子,逻辑结果是一致的
else
return recursion(apple,n-1)+recursion(apple-n,n);  //左边:忽略当前层一个盘子后考虑n-1个盘子;右边:直接铺满整个当前层,每个盘子都放入一个苹果,进入下一层

int main() 

int t,apple,n; 
cin>>t; 
while(t--){  
cin>>apple>>n;
cout<<recursion(apple,n)<<endl;
    
 } 

相关文章:

  • 2021-08-01
  • 2021-12-11
  • 2021-06-21
  • 2021-08-20
  • 2021-05-26
猜你喜欢
  • 2021-10-15
  • 2022-12-23
  • 2022-12-23
  • 2021-07-21
  • 2021-08-07
  • 2021-12-24
相关资源
相似解决方案