算法刷題-放蘋果-JAVA

0x00 引言

爲獲取一個良好的算法思維,以及不再成爲一個腳本小子,爭取每天一道算法題,培養自己的邏輯思維,溫顧各類型語言語法知識。

題解只寫自己理解的解法,其他解法不再增加。題目與解析均在代碼裏面。

0x01 難度等級

簡單

0x02 代碼

package 簡單;

import java.util.Scanner;

/*

採用遞歸的思想將此事件無限細分,
每個事件可以分爲f(m,n)=f(m-n,n)+f(m,n-1);
f(m-n,n)是當蘋果數大於等於盤子數的情況,m個蘋果,n個盤子,m>n時,每個盤子都能分到至少一個蘋果,所以只需要考慮把剩下的m-n個蘋果分給n個盤子的問題
f(m,n-1)是當蘋果數小於盤子數的情況。蘋果數小於盤子,至少是有一個盤子沒有蘋果,所以是把m個蘋果分給n-1個盤子

當此事件分到蘋果數爲0或蘋果數爲1或盤子數爲1的時候返回1,
當蘋果數小於0或盤子數小於等於0返回0.

描述
把m個同樣的蘋果放在n個同樣的盤子裏,允許有的盤子空着不放,問共有多少種不同的分法?
注意:如果有7個蘋果和3個盤子,(5,1,1)和(1,5,1)被視爲是同一種分法。

數據範圍:
0≤m≤10 ,

1≤n≤10 。

示例1
輸入:
7 3

輸出:
8
*
*
*
* */
public class 放蘋果 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        System.out.println(count(m,n));
    }
    public static int count(int m,int n)
    {
        if(m<0||n<=0)
            return 0;
        //細分到蘋果數爲一或盤子數爲一的情況返回一
        if(n==1||m==0)//0≤m≤10 ,1≤n≤10
            return 1;
        //將此事件無線細分
        return count(m,n-1)+count(m-n,n);
    }
}

0x03 算法思想

考查遞歸的思想:
每個事件可以分爲f(m,n)=f(m-n,n)+f(m,n-1); f(m-n,n)是當蘋果數大於等於盤子數的情況,m個蘋果,n個盤子,m>n時,每個盤子都能分到至少一個蘋果,所以只需要考慮把剩下的m-n個蘋果分給n個盤子的問題 f(m,n-1)是當蘋果數小於盤子數的情況。蘋果數小於盤子,至少是有一個盤子沒有蘋果,所以是把m個蘋果分給n-1個盤子。主要是以下的臨界值作爲判斷:
        if(n==1||m==0)//0≤m≤10 ,1≤n≤10
            return 1;

0x04 運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章