0 1揹包(動態規劃)

2021-07-11 12:24:30 字數 893 閱讀 8409

題意:

有n件物品和乙個容量為v的揹包。第i件物品的體積是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。

基本思路

這是最基礎的揹包問題,特點是:每種物品僅有一件,可以選擇放或不放。用子問題定義狀態:即f[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程便是:

f[i][v] = max。

這個方程非常重要,基本上所有跟揹包問題相關的問題的方程都是由它衍生出來的。所以有必要將它詳細解釋一下:將前i件物品放入容量為v的揹包中這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只涉及前i-1件物品的問題。

如果不放第i件物品,那麼問題就轉化為前i-1件物品放入容量為v的揹包中,此時能獲得的價值為f[i-1][v];

如果放第i件物品,那麼問題就轉化為前i-1件物品放入剩下的容量為v-c[i]的揹包中,此時能獲得的最大價值就是:f[i-1][v-c[i]]+w[i]。

**:#include#includeusing namespace std;

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

int main()

{ int t,i,j,n,m;

cin>>t;

while(t--)

{cin>>n>>m;

for(i=1;i<=n;i++)

cin>>v[i];//價值

for(i=1;i<=n;i++)

cin>>w[i];//體積

memset(dp,0,sizeof(dp));

for(i=1;i<=n;i++)

for(j=m;j>=w[i];j--)

dp[j]=max(dp[j],dp[j-w[i]]+v[i]);

cout<

動態規劃 01揹包

最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...

01揹包動態規劃

0 1揹包 問題描述 乙個旅行者有乙個最多能用 m公斤的揹包,現在有 n件物品,它們的重量 分別是w1,w2 wn,它們的價值分別為 c1,c2,cn.若每種物品只有一 件求旅行者能獲得最大總價值。輸入格式 w 第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 w第2.n 1 行...

動態規劃01揹包

01揹包問題簡介 詳細說明 狀態轉移方程詳解 舉例 塊 測試結果 0 1揹包問題 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能將...