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;