title: 每日一题–分苹果
date: 2019-11-17 10:22:29
tags:
- 算法
- 每日一题
- 动态规划
64.分苹果 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?M, N为自然数。
说明:如有7个苹果,3个盘子,则(5, 1, 1)和(1, 5, 1)和(1, 1, 5)都是同一种分法。
输入描述
第一行一个整数表示数据的组数(多组数据),对于每组数据第一行是苹果个数M (1 ≤ m ≤ 100) ,
第二行是盘子个数N(1 ≤n ≤100)。
输出描述
每组数据输出一行,放苹果的方法个数。
输入样例
1
3
2
输出样例
2
#include <stdio.h>
/*
T: 测试组数
m: 苹果数
n: 盘子数
*/
int T, m, n;
int fun(int m, int n){
//递归结束条件:盘子只有一个或者没有苹果了
if(m == 0 || n == 1){
return 1;
}
//当盘子数大于苹果数时,空的盘子直接移除
if(m < n){
return fun(m, m);
}
//苹果数大于盘子数,分有无空盘两种情况考虑
if(m >= n){
return fun(m - n, n) + fun(m, n - 1);
}
}
int main(){
scanf("%d", &T);
while(T--){
scanf("%d%d", &m, &n);
printf("%d\n", fun(m, n));
}
return 0;
}
套路题,注意递归结束条件以及情况划分。