演算法學習 分組揹包問題

2021-09-28 16:40:36 字數 1581 閱讀 4462

有n件物品和乙個容量為v的揹包,第i件物品的重量為w[i],價值為v[i],這些物品被劃分成了若干組,每組中的物品互相衝突,最多選一件

問將哪些物品放入揹包中可以使揹包獲得最大的價值

對於每一組的物品,都可以看成是乙個01揹包問題,對每組的物品都處理一遍即可。

輸入格式:

第一行:三個整數,v(揹包容量,v<=200),n(物品數量,n<=30)和t(最大組號,t<=10);

第2…n+1行:每行三個整數wi,vi,p,表示每個物品的重量,價值,所屬組號。

從這篇部落格參考的思路

若是二維陣列的表現形式:

組數迴圈

物品選擇

體積迴圈

// 二維陣列:

f[k][j]表示前k組體積為j的最大價值

for(int k=1; k<=t; ++k) //組別

for(int i=1; i<=n; ++i) //物品

for(int j=v; j>=0; j--) //體積

f[k][j] = max(f[k][j], v[k][i]+f[k-1][j-w[k][i]] ); //求組這組最大

其中,f[k-1][j]指的是前k-1組體積為j的最大價值,因此v[k][i] + f[k-1][j-w[k][i]]意思是:取當前這組第i個物品 + 前k-1組體積為j-w[k][i](體積就還剩扣掉當前物品的體積的值)的價值。

到一維的話:

分組組數

體積迴圈

對物品進行遍歷

// 一維陣列 :f[j]表示體積為j的時候的最大價值!(每組都共用乙個dp陣列,dp陣列儲存最大價值)

for(int k=1; k<=t;k++)

for(int j=v; j>=0; j--) //分組體積

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

其中,以下總體用了一維陣列的形式。

**和輸入值可以參考這篇部落格

#include#include#include #includeusing namespace std;

const int maxn=105;

const int maxv=105;

const int maxt=15;

int n,v,t;

int v[maxn], w[maxn];

int dp[maxv]; //f存的是代價函式,因此以v為單位,f的意思是容量為c時該組取所需元素的最大值

int groupitem[maxt][maxn]; //a存放的是分組t裡的物品編號

int main()

// 開始求解,分別是①對組;②對每組來說的容量;③對該組內的物品進行~

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

}cout<

return 0;

}

演算法學習 01揹包問題

是慕課網的實戰演算法課程 動態規劃 相當於還是求n個物品的組合!暴力解法 每一件物品,都可以放進揹包,也可以不放進。複雜度是o 2 n n 對於每乙個組合,還要看看對應的總重是多少,看看是不是超過了容量c,從而看價值。組合方式都可以用遞迴的方式來求解。只是是能不能找到重疊子問題 最優子結構,從而轉換...

分組揹包問題

有 n nn 組物品和乙個容量是 v vv 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij v vi j 價值是 wij w wi j 其中 i ii 是組號,j jj 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸...

分組揹包問題

有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空格隔開,分別表...