题目描述
把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。
输入描述:
输入包含多组数据。
每组数据包含两个正整数 m和n(1≤m, n≤20)。
输出描述:
对应每组数据,输出一个整数k,表示有k种不同的分法。
示例1
输入
7 3
输出
8
解题思路:可以看成递归和动态规划,反正需要推理一下。
#include<iostream>
using namespace std;
int f(int i,int k){
if(k > i) return f(i,i); //盘子比苹果多,则直接把多余的盘子去掉
if(i == 0) return 1;
if(k == 0) return 0;
return f(i,k - 1) + f(i - k,k); //苹果比盘子多,则去掉一个盘子和不去盘子
}
int main(){
int i,k;
while(cin>>i>>k){
cout<<f(i,k)<<endl;
}
return 0;
}
版本2
可以考虑看中国MOOC网上郭炜老师讲的程序设计与算法2
#include<iostream>
using namespace std;
int f(int apple,int plate){
if(plate > apple) return f(apple, apple);
if(apple==0) return 1;
if(plate==0) return 0;
return f(apple,plate-1) + f(apple-plate,plate);
}
int main(){
int apple,plate;
while(cin>>apple>>plate){
cout<<f(apple, plate)<<endl;
}
return 0;
}