有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,用空格隔開,分別表...