计蒜客T1208 放苹果

在这里插入图片描述
这道题可以用动态规划来解,也可以递归来做。

递归:
(m,n)代表m个苹果分在n个盘子里的分法,这里分三种情况:

  1. 没有苹果或只有一个盘子时,(m=0||n==1)只有一种分法。
  2. 第二种是苹果的数量小于盘子的数量(m<n),这时候的分法等于(m,n)=(m,m),就像3个苹果分在5个盘子里的分法等于3个苹果在3个盘子的分法;
  3. 第三种情况是苹果的数量大于等于盘子的数量,这里可以拿有没有盘子进行讨论:
    如果没有空盘子,那每个盘子减去一个苹果和不减去一个苹果的分法是一样的,即(m,n)=(m-n,n)。就像7个苹果分3个盘子里,如果没有空盘子,那么三个盘子的苹果为1+x,1+y,1+z。这里面x+y+z=4。这就相当于4个苹果在3个盘子里面分,即(m,n)=(m-n,n)。
    有空盘子时,(m,n)=(m,n-1),每次递归的时候就减少一个盘子来算,比如,5个苹果放3个盘子里,如果有空盘子,这个问题就等价于5个苹果放2个盘子里。

AC代码:

#include<iostream>
#include<algorithm>
using namespace std; 

int Put(int m,int n){
	if(m==0) return 1;//没有苹果 
	if(n==1) return 1;//只有一个盘子
	if(m<n)
		return Put(m,m);//苹果数<盘子数
	else{
		//苹果数>=盘子数 
		//分为不是所有盘子都有苹果(有一个空盘子),以及所有盘子都有苹果(每个盘子里肯定有一个苹果) 
		return Put(m,n-1)+Put(m-n,n); 
	} 
}
int main(){
	int t;
	cin>>t;
	while(t--){
		int m,n;
		cin>>m>>n;
		cout<<Put(m,n)<<endl;
	}
	return 0;
}

动态规划解法见大佬博客:https://blog.csdn.net/weixin_44820625/article/details/104226272

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值