本蒟蒻的第三篇题解,望大家多多见谅!
P
a
r
t
Part
Part
1
1
1 读题
题目描述:
把 M M M个同样的苹果放在 N N N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用 K K K表示) 5 , 1 , 1 5,1,1 5,1,1和 1 , 5 , 1 1,5,1 1,5,1 是同一种分法。
输入格式:
第一行是测试数据的数目 t t t( 0 ≤ t ≤ 20 0≤t≤20 0≤t≤20)。
以下每行均包含二个整数 M M M和 N N N,以空格分开。 1 ≤ M 1≤M 1≤M, N ≤ 10 N≤10 N≤10。
输出格式:
对输入的每组数据 M M M和 N N N,用一行输出相应的 K K K。
输入样例:
1
7 3
输出样例:
8
数据范围与提示:
0 ≤ t ≤ 20 0≤t≤20 0≤t≤20, 1 ≤ M 1≤M 1≤M, N ≤ 10 N≤10 N≤10。
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 N−M个盘子空着,而盘子都是一样的,就不用管这些盘子了,所以就变成了 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) (N−1).
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) (M−N,N),后面情况是 f e n fen fen ( M , N − 1 ) (M, N - 1) (M,N−1)。
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的关系,以及相关代码的编写
看完题解后,会不会感到很简单呢?赶快去试试吧!