動態規劃 常見揹包問題合集

2021-07-29 05:16:16 字數 1375 閱讀 5284

01揹包:

有n件物品和乙個容量為v的揹包。(每件物品只有一件)第i件物品的費用是c[i],價值是v[i],求解將哪些物品裝入揹包使總價值最大。

轉移方程:f[i][v]=max,可以優化只用一維陣列.

**如下: 

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

if(record[j-c[i]]+v[i]>record[j])

record[j]=record[j-c[i]]+v[i];

完全揹包:

如果物品不計個數,即每個物品有無窮多件的話,稍微改一下**即可。 

for(int i=0;irecord[j])

record[j]=record[j-c[i]]+v[i];

多重揹包:

每個物品給出確定的件數,求可以得到的最大價值。 

for(i=0;i=v[i];k--)

if(record[j-c[i]]+v[i]>record[j])

record[j]=record[j-c[i]]+v[i];

優化版本:

//0-1揹包,代價為cost,獲得的價值為weight

void zeroonepack(int cost,int weight)

//完全揹包,代價為cost,獲得的價值為weight

void completepack(int cost,int weight)

//多重揹包

void multiplepack(int cost,int weight,int amount) 

for(i=0;i=v[i];x--)

} }

分組揹包:

有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為若干組,每組中的物品互相衝突,

最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

for(int i=1;i<=n;i++)//有n組

for(int j=v;j>=1;j--)//從後往前遍歷

for(int k=1;k<=m;k++)//第i組內的各個資料

if(j-k>=0&&dp[j]

需要注意的細節:

如果沒有要求揹包一定要裝滿,則record[i]初始化為0。如果要求一定要裝滿,則除了record[0]為0之外其他record[i]初始化為-inf。

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...