题目描述
把 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;
}