標籤:out print rgs str 沒有 style apple reader new
1、放蘋果問題
問題描述:
把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
2、代碼實現
1 package com.wcy.october; 2 3 import java.util.Scanner; 4 5 /** 6 * 時間:2016年10月23日 7 * 問題描述:把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的放法?(用K表示)注意:5,1,1和1,5,1是同一種分法。 8 * 輸入資料:第一行是測試資料的數目t(0<=t<=20),以下每行均包含兩個整數M和N,以空格分開。1<=M,N<=10。 9 * 輸出要求:對輸入的每組資料M和N,用一行輸出相應的K。10 * 輸入範例11 * 112 * 7 313 * 輸出範例14 * 815 * 16 * 方法解析:17 * 1、所有不同的擺放方法可以分為兩類:至少有一個盤子空著和所有的盤子都不空。我們可以分別計算這兩類擺放方法的數目,然後把它們加起來。對於至少空著一個18 * 盤子的情況,則N個盤子擺放M個蘋果的擺放數目與N-1個盤子擺放M個蘋果的擺放方法數目相同。對於所有盤子都不空的情況,則N個盤子擺放M個蘋果的擺放方法19 * 數目等於N個盤子擺放M-N個蘋果的擺放方法數目。我們可以據此來用遞迴的方法求解這個問題。20 * 2、設f(m,n)為m個蘋果,n個盤子的放法數目,則先對n作討論,如果n>m,必定有n-m個盤子永遠空著,去掉它們對擺放蘋果放法數目不產生影響;21 * 即if(n>m)f(m,n)=f{m,m}。當n<=m時,不同的方法可以分為兩類:即有至少一個盤子空著或者所有盤子都有蘋果,前一種情況相當於22 * f(m,n)=f(m,n-1);後一種情況可以從每個盤子中拿掉一個蘋果,不影響不同放法的數目,即f(m,n)=f(m-n,n)。總的放蘋果的放法數目等於兩者23 * 的和,即f(m,n)=f(m,n-1)+ f(m-n,n)。整個遞迴流程說明如下:24 * int f(int m,int n){25 * if(n==1||m==0)return 1;26 * if(n>m)return f(m,m);27 * return f(m,n-1)+f(m-n,n)}28 * 3、出口條件說明:當n=1是,所有蘋果都必須放到一個盤子裡,所有返回1,當沒有蘋果可放時,定義為1种放法。遞迴的兩條路,第一條n會逐漸減少,終會達到29 * 出口n==1;第二條m會逐漸減少,因為n>m時,我們會return f(m,m)所以終會到達出口m==0.30 */31 public class Apple {32 33 /**34 * 求放置方法數目35 * @param m 蘋果數目36 * @param n 盤子數目37 * @return 放置方法數目38 */39 public int getResult(int m,int n){40 if (n == 1 || m == 0) {41 return 1;42 }else if (m < n) {43 return getResult(m, m);44 }else {45 return getResult(m, n-1) + getResult(m-n, n);46 }47 }48 49 /**50 * 使用者頁面測試51 * @param args52 */53 @SuppressWarnings("resource")54 public static void main(String[] args) {55 Apple apple = new Apple();56 Scanner reader = new Scanner(System.in);57 int number = reader.nextInt();58 int[] result = new int[number];59 int m = 0; // 蘋果數目60 int n = 0; // 盤子數目61 for (int i = 0; i < number; i++) {62 m = reader.nextInt();63 n = reader.nextInt();64 result[i] = apple.getResult(m, n);65 }66 67 for (int i = 0; i < result.length; i++) {68 System.out.println(result[i]);69 }70 }71 }
放蘋果問題