输入 m,n,分别表示苹果数与盘子的总数,要求输出m个苹果放在 n个盘子的方法总数。

例如,输入:7 3
输出:8
递归求解

解题思路:设f(m,n)为m个苹果放到n个盘子的放法总数,先对n做讨论:
当n>m时:必定有n-m个盘子永远空着,去掉他们对摆放苹果方法总数没有影响,即if(n>m) f(m,n)=f(m,m)
当n<=m时:不同的放法可以分为两类:含有空盘的方案,不含空盘的方案
1、含空盘,即至少有一个盘子空着,即f(m,n)=f(m,n-1)
2、不含空盘,即全部盘子都有苹果,那么先从m个苹果中抽取n个每个盘子放一个,考虑剩下的m-n个苹果放到n个盘子的放法,即f(m,n)=f(m-n,n)
总的放苹果的方法数等于两种方案的方法数之和,即f(m,n)=f(m,n-1)+f(m-n,n)
递归出口条件:
当n=1时,所以苹果放到一个盘子里,返回1;
当m=0时,没有苹果可放,定义为一种放法

#include<bits/stdc++.h>
using namespace std; 
int find(int apple, int plant) //m个苹果放在n个盘子中共有几种方法
{
    if(apple==0 || plant==1)//递归出口 
        return 1;
    if(plant > apple)
        return find(apple, apple);
    else
        return find(apple, plant-1) + find(apple-plant, plant);
}
int main()
{
	int apple, plant;
	cin >> apple >> plant;
	cout<<find(apple, plant)<<endl;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值