動態規劃 揹包

2021-07-09 16:40:16 字數 1921 閱讀 7620

揹包經典問題:

揹包問題01:

乙個揹包容積為t(0<=t<=2000),現在有n(0

**如下:

#includeusing namespace std;

int s[1005];

bool f[3000];

int main()

}

揹包問題02

若每種物品有無限多個。從這n種物品中選取若干個裝入揹包內,使揹包所剩的空間最小。請求出最小的剩餘空間?

只需改為正序列舉即可:

for(k=s[i];k<=v;k++)

if(f[k-s[i]])f[k]=true;

揹包問題03

乙個揹包容積為t(0<=t<=2000),現在有n(0

#include#includeusing namespace std;

int v[1005],w[1005],f[2000];

int main()

分別討論1-n個物品,f[i]表示用k的空間所能得到的最大價值。

揹包問題  4

description

乙個揹包容積為t(0<=t<=2000),現在有n(0

**如下:

#include#includeusing namespace std;

int v[1005],w[1005],f[2000];

int main()

揹包問題 5:

description

有兩個揹包,乙個容積為a,乙個容積為b,現在有n個物品,每個物品有一定體積v。 

每個物品有一定的價值w。從這n個物品中選取若干個裝入揹包內,使揹包內物品的價值最大。請求出最大價值?

狀態:f[i][j]表示第乙個揹包使用i,第二個揹包使用j的最大價值。

**如下:

#include#includeusing namespace std;

int s[105],w[105],f[305][305],v[105];

int main()

for(i=1;i<=a;i++) //找答案

for(k=1;k<=b;k++)

ans=max(ans,f[i][k]);

printf("%d",ans);

}

揹包問題的變形非常多,以下是一道雙揹包變形:

潛水員 nkoj1123

description

潛水員為了潛水要使用特殊的裝備。他有乙個帶2種氣體的氣缸:乙個為氧氣,乙個為氮氣。讓潛水員下潛的深度需要各種的數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定數量的氧和氮。他完成工作所需氣缸的總重的最低限度的是多少? 

例如:潛水員有5個氣缸。每行三個數字為:氧,氮的(公升)量和氣缸的重量: 

3 36 120 

10 25 129 

5 50 250 

1 45 130 

4 20 119 

如果潛水員需要5公升的氧和60公升的氮則總重最小為249(1,2或者4,5號氣缸)。 

你的任務就是計算潛水員為了完成他的工作需要的氣缸的重量的最低值。

分析:

雙揹包模型,只是必須填滿。

狀態:f[i][j]表示i公升氧氣,j公升氮氣所需要的最小重量。

**如下:

#include#includeusing namespace std;

int o2,n2,o[1002],n[1002],w[1002],f[100][100],n;

void input()

void solve()

printf("%d",f[o2][n2]);

}int main()

揹包(動態規劃)

一 01揹包問題 特點 每件物品僅有一件,可以選擇放與不放 有件物品和乙個容量為 的揹包。第 件物品的費用是 價值是 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。用子問題定義狀態 f i v max f i 1 v f i 1 v c i w i 注意有意義當且僅當存...

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃揹包問題 完全揹包

問題描述 有n種物品,每種均有無窮多個。第i個物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包中,使得揹包內物品在總體積不超過c的前提下重量盡量大。問題分析 開乙個陣列f i j 表示前i種物品中選取若干件物品放入剩餘空間為j的揹包中所能得到的最大重量。每種物品無窮個,所以還要有乙個k遍歷...