關於整數劃分

2021-08-31 03:09:55 字數 1681 閱讀 6910

有n多情況的整數劃分,下面就幾種這幾天學習的分別說一下:

1. 數n的劃分中,其最大值不能大於k:記其結果為f(n, k),那麼,

狀態轉移方程:當 n == 1 || k == 1 時,f(n, k) == 1, n為1,那麼只能為1; 而k為1,那麼只能劃分成n個1. 當 n < k 時,f(n, k) == f(n, n),因為n的劃分中不可能出現比n大的數,所以可以將最大值從k降到n; 當 n >= k 時,f(n, k) = f(n-k, k) + f(n, k-1), 前半部分是劃分中存在最大值k,所以可以在(n-k)中繼續以最大值為k來劃分,而後半部分則是劃分中最大值不是k,那麼其結果和以(k-1)為最大值的劃分是一樣的。在初始化中可以將f(0, k)初始化為1,及對應f(n, n)可能出現的情況,這樣那麼最後的程式為:

void dp()

for(int i = 2; i <= 120; i++)

}}!!如果這種情況下求取a[n][k],而 k >= n ,其結果就是n的所有劃分之和。

2. 將n劃分成k個正整數之和的劃分數:當 n < k 時,顯然是不可能的,那麼f(n, k) == 0; 當 k == 1 時,f(n, k) == 1; 當 n >= k 時,f(n, k) = f(n-k, k) + f(n-1, k-1),前半部分對應這k個數中不存在1的情況,那麼我們就可以將劃分中每個數都減去1,剩下的輸仍然是大於0的,等價於將n減去了k,而後半部分這是對應這k個數中存在1的情況,最終程式可以如下:

void dp()

}}!!如果要求可以小於k,那麼就可以將結果從1一直加到k。

3. 將n劃分成若干個奇正整數之和的劃分數:f(n, k) 表示n的劃分中最大值為k的劃分數。當 k == 1 時,其結果只能為n個1,當 k 是偶數時,有f(n, k) == f(n, k-1);當 k > n 時,有f(n, k) == f(n, n),理由同1;當 n >= k 時,有 f(n, k) = f(n, k-1) + f(n-k, k) 《此式中k為奇數,偶數可以對應前面的情況》,前半部分對應n的劃分數中最大值不為k,那麼可以從k-2開始,式中 k-1 的效果也能達到,同時還能在遞推中防止出現下標為負的情況;最終的程式可以如下:

void dp()

for(int i = 1; i <= 100; i++) else }}

}4. 將n劃分成若干不同整數之和的劃分數:f(n, k) 表示n的劃分中最大值為k的劃分數。當 k == 1 時,f(n, k) = 1;當 n < k 時;f(n, k) == f(n, n),理由同1;當 n >= k 時,有 f(n, k) == f(n-k, k-1) + f(n, k-1),前半部分對應的是劃分中存在k,而後一種情況對應n的劃分中不存在k,這兩種情況下都將遞迴條件從k換成 k-1 是因為當前的兩種情況已經將k的所有情形都已考慮,而劃分中k不能重複。所以最終的程式可以為:

void dp()

}}

兩個子情況:

①:當前的劃分裡面確實含有k,那麼對應的子狀態就是dp[n-k][k](注意dp[0][i]都被初始化成了1)

②:當前的劃分裡面不包含k,那麼對應的子狀態就不會含有k,即是dp[n][k-1]

思路:就是看當前的劃分裡面有沒有1,不知道是誰一開始想起來的

①:當前的劃分裡有1,對應的狀態就是dp[n-1][k-1]

②:當前的劃分裡沒有1,那k個的整數都減去1,對應的狀態就是dp[n-k][k]

整數劃分(劃分dp)總結

寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...

整數劃分問題

整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...

整數劃分問題

給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...