P2386 放苹果(洛古)

放苹果

题目描述

m ​ m​ m 个同样的苹果放在 n ​ n​ n 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。( 5 , 1 , 1 ​ 5,1,1​ 5,1,1​ 1 , 1 , 5 ​ 1,1,5​ 1,1,5​ 是同一种方法)

输入格式

第一行是测试数据的数目 t t t,以下每行均包括二个整数 m m m n n n,以空格分开。

输出格式

对输入的每组数据 m m m n n n,用一行输出相应的结果。

样例 #1

样例输入 #1

1
7 3

样例输出 #1

8

样例 #2

样例输入 #2

3
3 2
4 3
2 7

样例输出 #2

2
4
2

提示

对于所有数据,保证: 1 ≤ m , n ≤ 10 1\leq m,n\leq 10 1m,n10 0 ≤ t ≤ 20 0 \leq t \leq 20 0t20

【算法分析】

当苹果数<=盘子数时,问题转化为i个苹果放到i个盘子里。

当苹果数>盘子数时,分为两种情况:(1)无空盘,(2)有空盘

【递推算法分析】

使用i和j分别表示苹果数和盘子数,建立表格如下:

12345678
111111111
212222222
312333333
413455555
513567777
6147910111111
71481113141515
815101518202122

(1)当盘子数为1时,只有一种情况。

(2)当苹果数为1时,只有一种情况。

(3)当苹果数<=盘子数时,问题转化为i个苹果放在i个盘子中,即 f [ i ] [ j ] = f [ i ] [ i ] = f [ i ] [ i − 1 ] f[ i][ j ]=f[i][i]=f[i][i-1] f[i][j]=f[i][i]=f[i][i1]

(4)当苹果数>盘子数时,分为两种情况:

  • 不需要有盘子为空,即 f [ i − j ] [ j ] f[i-j][j] f[ij][j]
  • 需要有盘子为空,即 f [ i ] [ j − 1 ] f[i][j-1] f[i][j1]
  • 即问题转化为
#include<bits/stdc++.h>
using namespace std;
int f[15][15];
int main(){
   int t;
   int x,y;
   cin>>t;
   for(int i=1;i<=10;i++){
	   	f[1][i]=1;
	   	f[i][1]=1;
   }
  
   for(int j=2;j<=10;j++)
		for(int k=2;k<=10;k++)
			if(j<=k){
				f[j][k]=f[j][j-1]+1;
			}else{
				f[j][k]=f[j-k][k]+f[j][k-1];
			}
   
   for(int i=1;i<=t;i++){
   	cin>>x>>y;   
    cout<<f[x][y]<<endl;
   }
    return 0;
}

【递归算法分析】

  • 当盘子数量或者苹果数量为1时,方案数为1;
  • 当苹果数<盘子数时,方案转化为f(x,x);
  • 当苹果数=盘子数时,方案数为f(x,x-1)+1;
  • 当苹果数>盘子数时,两种情况:(1)有空盘f(x,y-1), (2)无空盘f(x-y,y)。
#include<bits/stdc++.h>
using namespace std;
int f(int x,int y){
	if(x==1||y==1)return 1;
	if(x<y) return f(x,x);//苹果<盘子
	if(x==y) return 1+f(x,y-1);//苹果==盘子
	if(x>y) return f(x,y-1)+f(x-y,y);
}
int main(){
   int t;
   int x,y;
   cin>>t;
   for(int i=1;i<=t;i++){
   	cin>>x>>y;
   	cout<<f(x,y)<<endl;
   }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小芒果_01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值