目錄2.true、false問題公式
3.最大最小問題公式
cs-note關於動態規劃的文章
518. 零錢兌換 ii (完全揹包+順序無關)
物品的數量是無限的
明確問題的性質
組合問題:dp[i] += dp[i-num]
完全揹包 且 順序無關:nums在外target在內494. 目標和(0-1揹包+順序無關)
明確問題的性質
組合問題:題解dp[i] += dp[i-num]
0-1揹包問題,且,是組合問題(順序不影響)nums在外,target在內,且target倒序迴圈把所有符號為正的數總和設為乙個揹包的容量,容量為x;把所有符號為負的數總和設為乙個揹包的容量,容量為y。
在給定的陣列中,有多少種選擇方法讓揹包裝滿。
令sum為陣列的總和,則x+y = sum。
而兩個揹包的差為s,則x-y=s。(s已知)
從而求得x=(s+sum)/2。
基於上述分析,題目轉換為揹包問題:給定乙個陣列和乙個容量為x的揹包,求有多少種方式讓揹包裝滿。
377. 組合總和 ⅳ (完全揹包+順序有關)class solution
if (s>sum || (s+sum)%2==1) return 0;
int target = (s + sum) / 2;
int dp = new int[target + 1];
dp[0] = 1;
for (int num : nums) }}
return dp[target];}}
先給這道題定性
排列問題:dp[i] += dp[i-num]
完全揹包問題:且是 排列問題(順序有關)看懂的題解
416. 分割等和子集(0-1揹包 + 順序無關)
可以使用動態規劃解決
也可以使用 回溯+剪枝
明確問題性質
組合問題:dp[i] = dp[i] || dp[i-num]
0-1揹包 且 組合: nums 在外迴圈, target在內迴圈 且 逆序139. 單詞拆分 (完全揹包+順序有關)public boolean canpartition(int nums) }}
return dp[target];
}
給問題定性
排列問題: dp[i] = dp[i] || dp[i-num]完全揹包 且順序有關: target在外迴圈 nums在內迴圈
322. 零錢兌換 (完全揹包+順序無關)
明確問題性質
最大最小值問題:dp[i] = min(dp[i], dp[i-num]+1)
或者dp[i] = max(dp[i], dp[i-num]+1)
完全揹包問題: 且 順序無關 nums 在外迴圈、target在內迴圈474. 一和零 (01揹包+順序無關)public int coinchange(int coins, int amount) }}
return dp[amount] == (amount + 1) ? -1 : dp[amount];
}
明確問題性質
public int findmaxform(string strs, int m, int n) else
}// system.out.println("ones: " + ones);
// system.out.println("zeros: " + zeros);
// 計算不同揹包容量下的可能得到的結果
for (int i = m; i >= 0; i--) }}
}return dp[m][n];
}
三種簡單揹包問題模板 01揹包 完全揹包 多重揹包
概念 給定n種物品的價值和重量,每種物品最多只能取一次。求出當揹包容量為m時能夠裝下的最大價值 一維的寫法,dp陣列代表的是當前狀態能夠放下的最大價值 for int i 0 i w i j dp j max dp j dp j w i v i 對於第i件物品,可以放或不放。不放 dp j dp j...
混合三種揹包問題
問題 如果將01揹包 完全揹包 多重揹包混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?01揹包與完全揹包的混合 考慮到在01揹包和完全揹包中最後給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一...
混合三種揹包問題
問題 如果將01揹包 完全揹包 多重揹包混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?01揹包與完全揹包的混合 考慮到在01揹包和完全揹包中最後給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一...