1. 程式人生 > >poj1664放蘋果【遞迴】

poj1664放蘋果【遞迴】

vj題目連結:https://cn.vjudge.net/problem/POJ-1664

題目描述

把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。

Input

第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=M,N<=10。

Output

對輸入的每組資料M和N,用一行輸出相應的K。

Sample Input

1
7 3

Sample Output

8

AC程式碼

#include <iostream>
using namespace std;
int M,N;
int solve(int m,int n) 
{
	if(m == 0)
		return 1;
	if(n == 1)		// 只有一個盤子時,無論多少個蘋果都只有一種放法
		return 1;

	if(m >= n)
		return solve(m,n-1) + solve(m-n,n);	
	// 若果蘋果的數目m大於盤子的數目n,可以每個盤子都有蘋果,也可以有盤子沒有蘋果
	// (m,n-1)是有空盤子的情況
	// (m-n,n) 是所有盤子都有蘋果,也就是先每個盤子都放一個,然後再放剩下的m-n個

	// 當蘋果數目m小於盤子數目n時,相當於最多隻能放m個盤子
	return solve(m,m);

}
int main()
{
	int T;
	cin >> T;
	while( T--) {
		cin >> M >> N;
		cout << solve(M,N) << endl;
	}
}