遞歸訓練-放蘋果
問題 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 2018年3月21日下午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); } } } |
遞歸訓練-放蘋果