分組揹包問題解法

2021-06-28 23:56:32 字數 1007 閱讀 4887

前面的部落格中提到了0/1揹包問題,下面說明一種更加複雜的動態規劃問題——分組揹包。

乙個容量為v的揹包

和有n(0,1,2……i……n)件物品。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

這個問題變成了每組物品有若干種策略:是選擇本組的某一件,還是一件都不選。設f[k][v]表示前k組物品花費費用v能取得的最大權值,則有:

f[k][v]=max

使用一維陣列的偽**如下:

for 所有的組k

for v=v..0  #花費從v到零,為防止重複選擇同一組中的多個物品

for 所有的i屬於組k

f[v]=max

最後的f[v]即為所求。

下面介紹一種使用分組揹包的乙個例項:分組揹包給定 n 和 k。計算有多少長度為 k 的陣列 a1, a2, ..., ak,(0≤ai) 滿足:

a1 + a2 + ... + ak = n。

對於任意的 i = 0, ..., k - 1 有 ai and ai + 1 = ai + 1。其中and是與操作。

#includeusing namespace std;

#define mod 1000000009

int calc(int k,int n)

; int result_tem[10001]=;

result[0]=1;

result_tem[0]=1;

for(temp=1;temp<=n;temp*=2) //表示每個二進位制位

}for(j=0;j<=n;j++)

result[j]=result_tem[j];

} return result[n];

}int main()

return 0;

}

輸入:3 2

4 2輸出:

hdu 1226 揹包問題解法

對於每一位數,有m種選法,dp i j 代表到達第i位時,數對n取余為j時的屬性,列舉選擇的數時候從小到大保證答案是最小解。要特別注意存在0這個數的情況,特別容易出錯。include include include include include include using namespace st...

通俗理解0 1揹包問題解法

0 1揹包問題是乙個很經典的問題,使用動態規劃演算法來求解也是很經典的。下面我用乙個例子來講解用動態規劃演算法求解0 1揹包問題。假設商店中有5件東西,重量用w表示,用v表示 現在有乙個小偷來到了小店中,這哥們帶了乙個袋子,但是這個袋子只能裝20公斤 w 20 的東西,問題來了,他怎麼樣偷才能拿到總...

01揹包問題解法及優化

給定乙個容量為c的揹包,重量為weight,價值為value的石頭,求揹包能容納的最大價值。例 weight 1 2,3 value 6 10,12 c 5輸出 22 揹包中放入乙個重量為3的石頭和乙個重量為2的石頭 value 10 12 22.public intfindres int weig...