1. 程式人生 > >遞歸訓練-放蘋果

遞歸訓練-放蘋果

ner LG gpo 限制 兩種 fff ava 1.8 OS

問題 C: 【基礎】放蘋果 【遞歸】

時間限制: 1 Sec 內存限制: 128 MB
提交: 345 解決: 193
[提交][狀態][討論版]

題目描述

描述

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

輸入

輸入

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

輸出

輸出

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

樣例輸入

1
7 3

樣例輸出

8

提示

[提交][狀態]

思路分析:

這道題目不能說很難,具體分析過程是這樣的:將m個蘋果放在n個盤子上,首先應該想到的就是兩種情況 ①.盤子的數量比蘋果的數量多(n>m) ②.蘋果的數量比盤子的數量多(m>=n)

對於第①種情況來分析的話呢,因為題目允許有空盤子不放,並且5,1,1和1,5,1是同一種分法。 那也就可以這樣得出,多余放不到蘋果的盤子怎麽移動都不會改變放蘋果的種類,既然如此,

我們就可以幹脆把多余的盤子略去不考慮,既 n>m fn(m,n)=fn(m,m)

對於第②種情況來分析,當蘋果的數量大於等於盤子的數量時(m>=n) ,應該想可以分成兩種放法,第Ⅰ種是先把所有的盤子裝滿,再去放剩下的蘋果,即fn(m,n)=fn(m-n,n) 第Ⅱ種是遞歸的去思考,要求m個蘋果

放在n個盤子的方法,可以先求m個蘋果在n-1個盤子上的放法,一層層往上求,直到只有1個盤子的情況返回1。

綜上有,

fn(m,n)=fn(m,m) m<n

fn(m,n)=fn(m,n-1)+fn(m-n,n) m>=n

上代碼:

package com.eangaie.main.m1;

import java.util.*;

/**

*

* @CreateTime 2018321下午8:01:20

*

* @author謝彥傑

*

* @since JDK 1.8

*

* 文件名稱:C.java

*

* 放蘋果

*

**/

public class C {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in = new Scanner(System.in);

int m, n, num;

num = in.nextInt();

while (--num >= 0) {

m = in.nextInt();// 蘋果

n = in.nextInt();// 盤子

System.out.println(fn(m, n));

}

}

static int fn(int m, int n) {

if (m == 0 || n == 1) {

return 1;

}

// 當盤子數量比蘋果數量多

else if (n > m) {

return fn(m, m);

} else {

return fn(m, n - 1) + fn(m - n, n);

}

}

}

遞歸訓練-放蘋果