華為OJ平台——放蘋果(典型整數劃分問題)

來源:互聯網
上載者:User

標籤:

題目描述:

輸入m,n,分別表示蘋果數與盤子的總數,要求輸出蘋果放在n個盤子的方法總數(注意511和151是一種情況),例如輸入 7 3 輸出8((7),(6,1),(5,2),(4,3),(5,1,1),(4,2,1),(3,3,1),(3,2,2))

思路:

最典型的解法整數分解,例如給定n個蘋果,把蘋果放到k個盤子裡,允許有的盤子為空白,不妨設 f(n , k ) (邊緣條件為當 n = 0 ,1時,返回1,當 k = 1 時,返回1)表示結果,分析一下可以知道有兩种放的方法,一種是有空盤,一種是沒空盤。

沒空盤的情況可以知道每個盤子裡至少有一個蘋果,也就是說這種情況的總數為 f ( n-k , k ) 。

而有空盤的情況,我們可以假設最後一個盤子為空白,則這種情況的總數為f ( n , k-1 ) (無需考慮多個盤子為空白的情況,遞迴時必然會出現)

所以狀態轉移方程為 f ( n , k ) = f ( n-k , k ) + f ( n , k-1 )

 1 import java.util.Scanner; 2  3 /** 4  * 把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放, 5  * 問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 6  */ 7 public class PlayApples { 8  9     public static void main(String[] args) {10         //輸入讀取參數11         Scanner cin = new Scanner(System.in) ;        12         int apples = cin.nextInt() ;13         int planes = cin.nextInt() ;14         cin.close();15         16         System.out.println(count(apples,planes)) ;17 18     }19 20     /**21      * 最典型的整數分解22      * 例如給定n個蘋果,把蘋果放到k個盤子裡,允許有的盤子為空白, 不妨設 f(m , n ) 23      * (邊緣條件為當 m == 0 ,1時,返回1,當 n == 1 時,返回1)表示結果,24      * 分析一下可以知道有兩中放的方法,一種是有空盤,一種是沒空盤,25      * 沒空盤的情況可以知道每個盤子裡至少有一個蘋果,也就是說這種情況的總數為 f ( n-k , k ) 。26      * 而有空盤的情況,我們可以假設最後一個盤子為空白,則這種情況的總數為f ( n , k-1 ) (無需考慮多個盤子為空白的情況,遞迴時必然會出現)27      * 所以狀態轉移方程為 f ( n , k ) = f  ( n-k , k ) +  f ( n , k-1 )。28      * 29      * 而如果是不允許有空盤子的情況,則可以由上面的情況推出,30      * 設 d ( n , k ) 表示把n個蘋果放到k個盤子裡,不允許有空盤子的方法總數,31      * 則有f ( n , k ) =  Σ (  1 <= i <= k ) d ( n , i ) 32      * 所以 d ( n , k ) = f ( n , k ) - f ( n , k-1 )33      * 34      * @param m  蘋果數量35      * @param n  盤子數量36      * @return37      */38     private static int count(int m, int n) {39         //n為0 是錯誤的,故返回040         if(n == 0){41             return 0 ;42         }43         //m == 0,1時和 n == 1時均只有一种放法44         if(m == 0 || n == 1 || m == 1 ){45             return 1 ;46         }else if(m < 0){47             //m < 0 時,也是錯誤的情形,所以返回048             return 0 ;49         }else{50             //遞迴調用51             return count(m-n,n) + count(m,n-1) ;52         }    53     }54 }
Code

 

擴充:

而如果是不允許有空盤子的情況,則可以由上面的情況推出,設 d ( n , k ) 表示把n個蘋果放到k個盤子裡,不允許有空盤子的方法總數,則有

f ( n , k ) = Σ ( 1 <= i <= k ) d ( n , i ) 所以 d ( n , k ) = f ( n , k ) - f ( n , k-1 )

華為OJ平台——放蘋果(典型整數劃分問題)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.