#444. 分苹果

4 篇文章 0 订阅

本蒟蒻的第三篇题解,望大家多多见谅!

P a r t Part Part 1 1 1 读题
题目描述:

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

输入格式:

第一行是测试数据的数目 t t t 0 ≤ t ≤ 20 0≤t≤20 0t20)。

以下每行均包含二个整数 M M M N N N,以空格分开。 1 ≤ M 1≤M 1M N ≤ 10 N≤10 N10

输出格式:

对输入的每组数据 M M M N N N,用一行输出相应的 K K K

输入样例:

1
7 3

输出样例:

8

数据范围与提示:

0 ≤ t ≤ 20 0≤t≤20 0t20 1 ≤ M 1≤M 1M N ≤ 10 N≤10 N10

P a r t Part Part 2 2 2 思路

我们要输入 t t t,运行 t t t组,再考虑 M M M N N N的关系对其运算。其中运算共有 4 4 4种情况—— M = 1 M=1 M=1|| N = 1 N=1 N=1 M < N M<N M<N M = N M=N M=N M > N M>N M>N

1.输入

 int n,m,t;
    cin>>t;
    for(int i=1;i<=t;i++){
    	cin>>m>>n;
    	cout<<运算结果;
	}

2.判断

M M M N N N中有一个为 1 1 1:只有一种情况,返回 1 1 1

if(m==1||n==1) 
	return 1;

M M M小于 N N N:盘子多余苹果,肯定至少有 N − M N- M NM个盘子空着,而盘子都是一样的,就不用管这些盘子了,所以就变成了 f e n fen fen ( M , M ) (M, M) (M,M)

if(m<n) 
	return fen(m,m);

M M M等于 N N N:不放苹果的盘子从 0 0 0依次增多到 ( N − 1 ) (N-1) (N1).

if(m==n) 
	return 1+fen(m,n-1);

M M M大于 N N N:对于苹果分配, M M M个苹果,要么 N N N个盘子全用,这种情况下每个盘子拿出一个苹果不影响分配结果,要么至少有一个空盘子剩余,所以可能会出现两种情况,前面那种是 f e n fen fen ( M − N , N ) (M - N ,N) (MN,N),后面情况是 f e n fen fen ( M , N − 1 ) (M, N - 1) (M,N1)

if(m>n) 
	return fen(m,n-1)+fen(m-n,n);

大家分析完后,可以试着写代码哦!

P a r t Part Part 3 3 3 代码

函数

#include <bits/stdc++.h>
using namespace std;
int fen(int m,int n){
	if(m==1||n==1) return 1;
	if(m<n) return fen(m,m);
    if(m==n) return 1+fen(m,n-1);
    if(m>n) return fen(m,n-1)+fen(m-n,n);
}
int main() {
    int n,m,t;
    cin>>t;
    for(int i=1;i<=t;i++){
    	cin>>m>>n;
    	cout<<fen(m,n)<<endl;
	}
    return 0;
}

P a r t Part Part 4 4 4 总结

本题难点在于分析 M M M N N N的关系,以及相关代码的编写

看完题解后,会不会感到很简单呢?赶快去试试吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值