動態規劃整理(二)

2021-10-06 06:23:19 字數 1302 閱讀 4505

題目描述:

給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。
注意:

每個陣列中的元素不會超過 100

陣列的大小不會超過 200

分析 自頂向下分析:

我們先得到一半的值是多少 。 在進行填充 。

與01 揹包不同的是: 不受權重影響,但卻必須得填滿揹包

從 n個數字裡取出和為 c的情況 —> 從n-1個裡面取出和為c 或者 從n-1 個數字裡取出和為c-w[n]的數字 + n[c]

那麼 對於子問題 又形成了與原問題類似的情況。

所以 可以遞迴處理;

class

solution

public

:bool

canpartition

(vector<

int>

& nums)

};

很明顯 :遞迴時存在重疊計算:容易超時。

那麼我們引入記憶化搜尋

class

solution

public

:bool

canpartition

(vector<

int>

& nums)

};

自底向上 : 動態規劃一下
class

solution

};

這裡我直接使用了 o(n)的空間複雜度,當然也可用 o(n^2)的空間複雜度, 這還得針對具體什麼情況來看。

比如 要求找出滿足這些條件的組合 ,那就必須得用o(n^2)空間了

題目描述 :

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, …)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

自頂向下分析 :

當然 你也可以避開 下標0 申請陣列空間+1;

class

solution

private

: vector<

int> memo;

private

:int

subquestion

(int n)

自底向上 動態規劃:

class

solution

return dp[n];}

};

動態規劃學習整理

目錄怎麼dp 遞迴 有記憶的遞迴 自上而下記憶法 自下而上填表法的區別 揹包類問題的求解誤區 在學動態規劃思想之前求解裝包類問題時,很容易想到根據價效比排序優先裝高價效比物品的貪心演算法,這就有點像線性規劃,連續型變數我們可以通過求導來計算,但涉及到整型就會很頭疼了 想要舉反例很簡單,比如只有兩個物...

動態規劃經典題目整理

複雜度 o n w o nw o nw n nn為物品種類,w ww是揹包的重量 目的 使得揹包中的物品價值最大化 單副本揹包問題 每種物品只有一件 k w j ma xk w,j max k w,j max k w j k w,j k w,j 代表揹包重量為w ww,有j jj件物品時候的最大價值...

動態規劃習題整理(1)

狀態表示 f i 表示以第 i 個元素結尾的所有連續子陣列的最大值。狀態轉移 f i max f i 1 0 nums i f i 可劃分為兩部分,以第 i 1個元素結尾的所有連續子陣列加上第i個元素,或者只選用第 i 個元素。答案為所有f i 中的最大值。優化 由於f i 在計算時只會用到f i ...