三种基本背包问题
一、0/1背包問題
問題描述:有n件物品和容量為m的背包 給出i件物品的重量以及價值 求解讓裝入背包的物品重量不超過背包容量 且價值最大 。
特點:這是最簡單的背包問題,特點是每個物品只有一件供你選擇放還是不放。
① 二維解法
設f[i][j]表示前 i 件物品 總重量不超過 j 的最大價值 可得出狀態轉移方程
f[i][j]=max{f[i-1][j-a[i]]+b[i], f[i-1][j]}
在一些情況下 題目的數據會很大 因此f數組不開到一定程度是沒有辦法ac。
②一維解法
設f[j]表示重量不超過j公斤的最大價值 可得出狀態轉移方程
f[j]=max{f[j], f[j?a[i]]+b[i]}
二、完全背包問題
問題描述:有n件物品和容量為m的背包 給出i件物品的重量以及價值 求解讓裝入背包的物品重量不超過背包容量 且價值最大 。
特點:題干看似與01一樣 但它的特點是每個物品可以無限選用。
設f[j]表示重量不超過j公斤的最大價值 可得出狀態轉移方程
f[j] = maxj{f[j], f[j?a[i]]+b[i]}
三、多重背包問題
問題描述:有n件物品和容量為m的背包 給出i件物品的重量以及價值 還有數量 求解讓裝入背包的物品重量不超過背包容量 且價值最大 。
特點 :它與完全背包有類似點 特點是每個物品都有了一定的數量。
狀態轉移方程為:
f[j] = max{f[j], f[j?k?a[i]]+k?b[i]}
實戰:
題目一:322. 零錢兌換
總結
- 上一篇: 【汇编语言】DOSBox教程
- 下一篇: c 转时间戳php,php日期转时间戳,