用“分治算法”解决“放苹果问题”

本文介绍了一种使用分治算法来解决将N个苹果放入M个盘子的不同分法问题。通过递归公式C(n,m-1)+C(n-m,m)进行求解,并讨论了特殊情况的处理,如m大于n和n及m小于等于1的情况。最后给出了相应的代码实现。" 111263271,9391485,电商首页界面设计:提升视觉营销的关键,"['电商界面设计', '网页设计', '视觉设计', '用户体验', '营销策略']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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

Input
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据N和M,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8

思路:

n个苹果放在m个盘子里,记为C(n,m),可递归为C(n,m-1)+C(n-m,m)。C(n,m-1)表示n个苹果放入m-1个盘子的情况;而C(n-m,m)则表示n个苹果放满m个盘子,之所以为“n-m”,是因为先把n个苹果每个盘子都放一个,所以就剩下n-m个苹果。

但是,当“m>n”时,n个苹果无法放满m个盘子,所以此时只需“return c(n,n-1)”

接下来在考虑分解条件,当“n<=1||m<=1”时,只有一种情况,故 return 1;

综上所述,可得以下表达式:

n<=1或m<=1       return 1;
m>n                     return c(n,n-1);
m<=n                   return c(n,m-1)+c(n-m,m);

接下来就是代码:

//From Big_Heart
#include <iostream>
using namespace std;
int c(int ,int );
int i=0;
void main(){
	int n,m,count=0;
	cin>>count;
	while(count--){
		cin>>n>>m;
		cout<<c(n,m)<<endl;
	}
}
int c(int n,int m){
	if(n<=1||m<=1)
		return 1;
	if(m>n)
		return c(n,n-1);
	else
		return c(n,m-1)+c(n-m,m);
}
转载请写明出处:http://blog.youkuaiyun.com/u013797947


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值