放苹果

7 篇文章 0 订阅

题目:把M个相同的苹果放到N个同样的盘子里,允许有盘子不放,问一共有多少种放法。

注(5,1,1)和(1,5,1)是同一种放法。

输入:

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

输出:

对于每组数据,输出一个整数K

解析:

设函数f(i,k),i代表苹果的数量,k代表盘子的数量

1.当M<=N时,苹果的数量小于盘子的数量,苹果最多放到M个盘子里,所以f(M,N)=f(M,M)

2.当M>N时。假设有那么一个特殊的盘子,我的苹果要么放到所有盘子里,要么不放到那个盘子里。

所以一共的放法有f(M,N)=f(M,N-1)+f(M-N,N);

这样就可以通过递归不断缩小问题的规模,当函数调用一个函数时,下一个函数就会再考虑有没有这么一个盘子,放或者不放。

所以问题就会被分为有盘子为空和盘子不为空这两种情况。

最后只要考虑一下边界条件就好了,那就是当盘子的数量为1的时候只有一种放法。

这个问题当数据规模比较大的话,就会超时,要用动态规划来排除重复的解。

但是这里数据规模比较小,所以先用递归。


#include <iostream>
using namespace std;
int f(int i,int k);
int main(){
	int t,i,k;
	cin >> t;
	while(t--){
	
	cin >> i >> k;
	cout << f(i,k) << endl;
	
	}
	return 0;
}

int f(int i,int k){
	if(k == 1) return 1;
	if(i < k) return f(i,i);
	if(i > k) return f(i,k-1)+f(i-k,k);
	if(i == k) return f(i,k-1)+1; 
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值