dp 揹包問題

2022-05-03 11:09:21 字數 2503 閱讀 2706

乙個揹包總容量為v, 現在有n個物品, 第i個物品容量為weight[i], 價值為value[i], 現在往揹包裡面裝東西, 怎樣裝才能使揹包內物品總價值最大.主要分為3類:

總體的,又分為揹包剛好裝滿,與揹包沒有裝滿兩種情況

每種物品都只有1個,只有選擇與不選擇兩種狀態

有n件物品和乙個容量為v的揹包,每種物品只有一件,可以選擇放或不放。第i件物品的重量是w[i],價值是v[i]。求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。

對於任何只存在兩種狀態的問題都可以轉化為01揹包問題

定義狀態dp[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。

狀態轉移方程:

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

`dp[v]=max(dp[v],dp[v-w[i]]+v[i])`
空間複雜度o(nw)或者o(w),時間複雜度為o(nw)

for(int i=0;i=w[i];j--)

}

分析:

首先,大迴圈從0到n是指n個物體

其次,內迴圈是從揹包大小到當前物體的重量,是為了減少時間複雜度而這麼弄的

對於w[i]是物體的重量,如果剩餘揹包的大小小於w[i]了,就無需再迴圈,所以乙個端點在w[i]

而j的含義是當前的揹包總容量,而容量不可能大於揹包大小,所以另乙個大小就在揹包大小

如果是公升序,那麼就會對dp[j-w[i]]進行操作,也就意味著,如果j是w[i]的倍數,那麼v[i]就會不斷地加進去,也就是完全揹包問題了

而對於降序的話,也就保證了每次第j個物品都只能被放入1此,而不是多次,就是01揹包了

每種物品最多有n件可用

有n種物品和乙個容量為v的揹包。第i種物品最多有n件可用,每件體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。

對於多重揹包問題,可以轉化為01揹包問題,比如2個價值為5,重量為2的物品,可以轉化為a和b兩個物品,乙個價值為5,重量為2,乙個價值也為5,重量也為2

狀態轉移方程:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-k*w[i]]+k*v[i]) 其中0<=k<=c[i]

`dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i])`
k是每種物品放的數量

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

for(int j=m;j>=0;j--)

for(int k=1;k<=c[i];k++)

}}

每種物品都有無限件

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。

狀態轉移方程:

dp[i][j]=max(dp[i][j],dp[i-1][v-k*w[i]]+k*v[i]) 其中0<=k*w[i]<=揹包大小

`dp[j] = max(dp[j], dp[j - w[i]] + v[i]);`
分析見01揹包物體,和01揹包一樣,就是內迴圈的迴圈方向不同而已,乙個公升,乙個降

空間雜度為o(nw)或o(w),時間複雜度為o(nw)

**

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

}

將3種揹包進行混用,如果對於有些物品最多只能選一次,有些可以無限選

則利用01揹包和完全揹包的一行**不同,進行判斷

for(int i=0;i=w[i];j--)

}else if(第i個物品是完全揹包)

}}

如果再加上多重揹包的話

揹包混用偽**

for i= 1 to n

if 第i件物品屬於01揹包

zeroonepack(dp,wi,vi)

else if 第i件物品屬於完全揹包

completepack(dp,wi,vi)

else if 第i件物品屬於多重揹包

multiplepack(dp,wi,vi,ni)

#include#include#include#includeconst int n=1000000;

int v[n],w[n];

int dp[n];

void zeroonepack(int i)

}void completepack(int i)

}void multiplepack(int i)

}}int main()else if(第i個物品是完全揹包問題)else if(第i個物品是多重揹包問題)

}

DP 揹包問題

大牛 以下使用滾到陣列 若輸入要求一般,可以邊定義狀態邊輸入,不需儲存 memset f,0,sizeof int n 若求最小值,除 f 0 其餘初始化為 inf,f 0 0是必須的 求最大最小都一樣 確保有從無到有的起點 0 1揹包 一般形式 f i v max f i 1 v f i 1 v ...

揹包問題 DP

01揹包 現在有1個體積為mmax的揹包和n種物品 每種物品只有1個 每種物品的體積和價值分別是v i 和w i 求這個揹包最多可以裝價值多少的物品。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 設f i j 表示前i件物品恰放入乙個容量為j的揹包可以獲得的最大...

DP 揹包問題

小明同學在參加一場考試,考試時間2個小時。試卷上一共有n道題目,小明要在規定時間內,完成一定數量的題目。考試中不限制試題作答順序,對於 i 第道題目,小明有三種不同的策略可以選擇 1 直接跳過這道題目,不花費時間,本題得0分。2 只做一部分題目,花費pi分鐘的時間,本題可以得到ai分。3 做完整個題...