劃分數問題

2022-05-02 20:42:11 字數 1945 閱讀 7158

問題描述:有n個無區別的物品,將它們劃分成不超過m組,求出劃分方法數

這是一道經典的不能再經典的題目,當然也有不同的定義方式,下面將從兩種方式來分析這個問題

》把n個同樣的蘋果放在m個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示,5,1,1和1,5,1 是同一種分法

放蘋果的問題乍看之下很複雜,盤子是一樣的,蘋果也是一樣的;只要每個盤子裡面放的蘋果是一樣多的,不管順序如何最終得到的都是同一種分法。其實我們需要把問題簡化。就拿這個放蘋果的問題而言,我們只需要分兩種情況:有空盤子和沒空盤子。

1.有空盤子:f(n, m) = f(n, m-1)  //有空盤子很多人會有疑問,這不是只有乙個空盤子的情況嗎?那2個3個空盤子呢?可以先思考一下

2.沒有空盤子:f(n, m) = f(n-m, m)  //沒有空盤子,我們可以看成先給每乙個盤子放乙個蘋果,則還剩下n-m個蘋果,剩下的問題就是把這n-m個蘋果放到m個盤子裡的問題了。看到這裡你是不是有點明白為什麼第一種情況的遞推是那樣寫的,其實本質是一樣的,我們可以先看成先看成先讓乙個盤子空著,還有m-1個盤子,剩下的問題就是吧這n個蘋果放到m-1個盤子裡的問題。

因此:f(n, m) = f(n, m-1) + f(n-m, m)   ( n>=m) 

上面的表示式並不完整,當m寫到這裡主要表示式基本上已經寫完了,但是遞推一般都要有邊界,稍微看一下就能找到,當只有乙個盤子時明顯只有一種方法,另外沒有蘋果和只有乙個蘋果的時候也只有一種放法。即當m=1或者n=0時,f(n, m) = 1      

綜上:f(n, m) = 1  (m=1,n=0)

f(n, m) = f(n, n)   (n

f(n, m) = f(n, m-1) + f(n-m, m)   ( n>=m) 

》將n劃分成最大數不超過m的劃分數

1.當 n=1,d為1,因為無論m為多少就只有1

2.當 m=1 時,d=1 ,由上例可知,當 n=4 時,d只有 1+1+1+1 這1種

3.當 n=m 時,又分為兩種情況:

4.因此當 n=m 時,d(n , n)=1+ d(n,n-1)

5.當n < m 就相當於 d(n,n) 了

6.當 n > m 時,一種是不含m,為d(n,m-1)種,一種是含有m,有d(n-m,m)種

因此d(n,m)=d(n-m,m)+d(n,m-1)

(注意理解d(n-m,m),注意這裡的前提是劃分包含m,所以將m提出來乙個,保證劃分中一定會有m,剩下數字劃分的和為n-m,而這n-m中可能不會出現m,也可能出現m,但由於我們已經提出了乙個m,所以此處不用擔心m是否再出現。

第乙個數為什麼是(n-m),原因是提出乙個m後,已經保證了劃分中一定出現m,而n-m還沒有進行劃分,這裡忽略提出的m,對剩下的整數n-m進行劃分,劃分的最大值仍然是m)

前面之所以從不同的角度來分析是為了讓你能更好的理解狀態之間的遞推關係,懂了之後我們就能用動態規劃的思想來解決這個問題:

定義題目為n的m劃分數

(所有可能的情況都可以看作是把n劃分成m份。只是有的是取0的)

那我們可以定義狀態:dp[i][j]表示 j 的 i 劃分數 (注意,j的i劃分表示的意義為 j固定,i可以取到1- i)

狀態轉移方程:1.j >= i時,dp[i][j] = dp[i-1][j]( j的i-1劃分,相當於當前位取0的全部情況 ) + dp[i][j-i](當前位不取0,先把每乙個置為1,再將剩下的j-i分下去)

2.j < i時,dp[i][j] = dp[i-1][j];  當前位只能取0

核心**:

void

solve()

}printf(

"%d\n

", dp[m][n]);

}

劃分數 系列問題

整數劃分 乙個老生長談的問題 1 練練組合數學能力.2 練練遞迴思想 3 練練dp總之是一道經典的不能再經典的題目 這道好題求 1.將n劃分成若干正整數之和的劃分數。2.將n劃分成k個正整數之和的劃分數。3.將n劃分成最大數不超過k的劃分數。4.將n劃分成若干奇正整數之和的劃分數。5.將n劃分成若干...

整數劃分(數的m劃分)

includeusing namespace std int f int n,int m n代表數字,m代表n的m劃分 int main 方式二 動態規劃 dp i j 表示i的j次劃分的情況種數 狀態轉移方程為dp i j dp i j j dp i 1 j 1 1.dp i 1 j 1 表示劃分...

計數DP 劃分數

蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 n n 分解成不多於 k k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 leq n leq 300 n 1 n 300 和 k 1 leq k l...