題目描述:
給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。
注意:
每個陣列中的元素不會超過 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 ...