中級篇 揹包問題1(01揹包)

2021-07-08 22:22:01 字數 907 閱讀 3775

n件物品,沒見有重量wi,價值vi;選其中幾件放入容量為m的揹包中,求價值的最值。——經典揹包問題

揹包問題分三類:1.01揹包:每件物品僅一件,可以不將揹包裝滿(要麼取0件要麼1件)

2.完全揹包:每件物品無限件,可以不將揹包裝滿。

3.多重揹包:每件物品可一定數量件,可不將揹包裝滿。

此片詳解01揹包。

建乙個n*(m+1)的陣列dp[n][m],物品從第乙個開始遍歷依次裝入揹包。

關鍵公式:dp [ i ] [ j ] = max / min ( dp [ i - 1 ] [ j ] , dp[ i - 1 ] [ j - w[ i ] ] + v [ i ] ) ;

典例:題意:可理解為揹包問題,一共n樣物品各有其重量w[ i ]和價值v[ i ],給出揹包容量m求出揹包所容最大的價值。

分析:每件物品放入或不放入揹包,若不放入揹包,則dp[ i ] [ j ]的值即為dp[ i - 1 ] [ j ]。若是放入揹包,則需要在當重量為 j - w[ i ]  的基礎上加入物品 i,價值也應是在dp[ i ] [ j - w [ i ] ] 的值上再加上物品 i 的價值v [ i ] ,其價值即為dp[ i - 1 ] [ j - w[ i ] ]+ v[ i ] 。再取兩個之中的較大者即得到最優解。

**實現:

#include #include #include #include #include using namespace std;

int w[1005],v[1005],dp[1005][1005];

int main()

//裝不下則dp[i][j]=dp[i-1][j]

else dp[i][j]=dp[i-1][j];}}

cout<1203

2159

2955

1171

2191

揹包問題1(01揹包)

揹包問題 01揹包 以下內容為學習過程的總結,可能有些copy網上內容,請不要在意這些細節!01問題的提出 有n件物品和乙個容量為v的的揹包,n件物品的費用為c i i 1 n 價值為w i 問將那些物品放入揹包使得價值最大且不超過容量?思路 01揹包的特點是每種物品只有一件,可以選擇放或不放,可以...

動態規劃(1) 01揹包問題

題目 現有n個物品,重量依次為w i 使用int weight表示 價值依次為 v i 使用 int values表示 現有乙個可裝重量為17的包 使用bag表示 求使揹包物品價值最大化的最優解,示例 全排列問題 深度搜尋字典序 author swing public class main 物品的價...

揹包問題 01揹包 完全揹包 多重揹包

01揹包和完全揹包的區別 01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大 完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...