01揹包問題
有n件物品和乙個容量為c的揹包。第i件物品的費用是w[i],價值是v[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。
//w[i] 表示物品i的重量
//v[i] 表示物品i的價值
//c 表示揹包的容量
//dp[i][c]表示前i件物品恰放入乙個容量為c的揹包可以獲得的最大價值
//dp[i][c] = max(dp[i-1][c],dp[i-1][c-w[i]]+v[i])
//降維後:dp[c] = max(dp[c],dp[c-w[i]]+v[i])
max裡的dp[c]和dp[c-w[i]]儲存的是狀態dp[i-1][c]和狀態dp[i-1][c-w[i]]的值
//01 揹包 降維:
memset(dp,0,sizeof(dp)); //init
for(int i=1; i<=n; i++)
for(int c=c; c>=w[i]; c--) //注意,c要由c倒推到w[i],c完全揹包問題
有n種物品和乙個容量為c的揹包,每種物品都有無限件可用。第i種物品的費用是w[i],價值是v[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大
狀態轉移方程:
dp[i][c] = max(dp[i-1][c],dp[i][c-w[i]]+v[i])
降維後: dp[c] = max(dp[c],dp[c-w[i]]+v[i]) max裡的dp[c]和dp[c-w[i]]儲存的是狀態dp[i-1][c]和狀態dp[i][c-w[i]]的值
//完全 揹包 降維:
memset(dp,0,sizeof(dp)); //init
for(int i=1; i<=n; i++)
for(int c=w[i]; c<=c; c--) //注意,c要正推
dp[c] = max(dp[c],dp[c-w[i]]+v[i]); //c要正推才能保證在推dp[c]時,max裡的dp[c]和dp[c-w[i]]儲存的是狀態dp[i-1][c]和狀態dp[i][c-w[i]]的值
狀態壓縮技巧 動態規劃的降維打擊
本文由labuladong原創,本博文僅作為知識點學習,不會用於任何商業用途!動態規劃技巧對於演算法效率的提公升非常可觀,一般來說都能把指數級和階乘級時間複雜度的演算法優化成 o n 2 堪稱演算法界的二向箔,把各路魑魅魍魎統統打成二次元。但是,動態規劃本身也是可以進行階段性優化的,比如說我們常聽說...
動態規劃 揹包問題降維以及衍生的硬幣問題
任何動態規劃核心就是劃分子問題,然後就是狀態轉移方程。中間求出來的子問題的解需要儲存起來。0 1 揹包問題解決的是物品只能夠選擇1次要不就不選,在揹包能夠裝得下的前提下面,能夠保證裝的價值最大 狀態轉移方程 f i j max 0 j wi j 用二維的空間來表示是比較簡單的 一維表示 f v 表示...
動態規劃 網格非降路徑
題目 給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。說明 每次只能向下或者向右移動一步。示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和最小。class solution for int i...