前面的部落格中提到了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...