這兩個問題幾乎是相同的,但是以放蘋果的方式來思考問題明顯會更易理解。下面先看一下兩個問題的描述。
整數劃分
描述分蘋果問題將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。
m個同樣的蘋果放n個同樣的盤子,允許有盤子空著, 問有多少種放法。注意:5 1 1和1 5 1是同一種放法一、問題分析
定義函式f(m,n)。
對於整數劃分: m是要劃分的整數,n是劃分裡可能最大的數(不一定會有n);
對於放蘋果: m要放的蘋果總數,n是盤子個數。
以下為可能出現的m、n情況:
(1)m=1,或n=1,f(m,n)=1。在整數劃分裡,數字1顯然只有一種劃分方法,數m的最大劃分為1時也只有一種情況(m個1);分蘋果裡,乙個蘋果只有一種方法(不區分盤子),乙個盤子也只能把所有蘋果都放進來這乙個結果。
(2)m<1,或n<1,f(m,n)=0。整數劃分裡,要求數為正數,所以小於1無法進行劃分,劃分方式為0。當沒有蘋果或者沒有盤子時,也是無法「放蘋果的」。
(3)mn,f(m,n)= f(m-n,n)+f(m,n-1)。如果理解了第4條,就好理解很多。
對於放蘋果,把m個蘋果放到n個盤子裡=n個盤子都不為空+至少有乙個為空。而要實現n個盤子都不為空,可以先把n個盤子裡各放乙個蘋果,還剩m-n個蘋果隨機放,即為f(m-n,n)。至少有乙個為空也等於最多n-1個盤子放蘋果,f(m,n-1)。
對於整數劃分,還是比較抽象的。
數m的劃分最大可能為n=數m劃分裡一定包含n+數m的劃分裡一定不含n(最大就為n-1)
怎麼實現一定包含n呢?那我們就先從整數m裡分乙個n出來唄,易有m-n=m-n(哈哈,假裝算一下),這就保證了一定含n,剩下的數為m-n再隨機劃分為f(m-n,n),不需要考慮m-n和n的相對大小(遞迴哦,我們3,4,5就是幹這個的)。
一定不含n就簡單了吧,那就讓最大的可能變為n-1啊,f(m,n-1)。
個人感覺整數劃分和放蘋果的理解難度相差太大,當初整數劃分困惑了我很久,尤其是第5點,直到蘋果砸了一下我的腦袋。
建議從放蘋果的角度理解
(哦,在放蘋果問題裡,有的是認為沒有蘋果的時候,結果就為1,個人理解起來很困惑,而且按照那樣的思路理解好了後,遇到整數問題就得換思路了。)二、源**
#include
using
namespace std;
intf
(int m,
int n)
;int
main()
return0;
}intf(
int m,
int n)
//m為蘋果個數,n為盤子個數
整數劃分問題(放蘋果問題)(遞迴)
將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。標準的輸入包含若干組測試資料。每組測試資料是乙個整數n 0 n 50 對於每組測試資料,輸出n的劃分數。5,4 1,...
放蘋果與整數劃分問題(by幻星總結)
放蘋果與整數劃分問題 by幻星總結 以下均假設 m n,對於m n 情況請程式設計時自己注意 設h m,n 表示m 個數分成 n分,允許某分為 0 設g m,n 表示m 個數分成 n分,不允許某分為 0 於是兩者關係為 h m,n g m n,n 下面給出兩種方法求 h m,n g m,n 關於自身...
pku 1664 放蘋果 整數劃分
題目 放蘋果 description 把m個同樣的蘋果放在n個 同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。input 第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。output 對...