51NOD 1086 揹包問題 V2(多重揹包)

2021-08-17 02:03:31 字數 1058 閱讀 1727

1086 揹包問題 v2

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

有n種物品,每種物品的數量為c1,c2......cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2......wn(wi為整數),與之相對應的價值為p1,p2......pn(pi為整數)。求揹包能夠容納的最大價值。

input

第1行,2個整數,n和w中間用空格隔開。n為物品的種類,w為揹包的容量。(1 <= n <= 100,1 <= w <= 50000)

第2 - n + 1行,每行3個整數,wi,pi和ci分別是物品體積、價值和數量。(1 <= wi, pi <= 10000, 1 <= ci <= 200)

output

輸出可以容納的最大價值。
input示例

3 6

2 2 5

3 3 8

1 4 1

output示例

9
這是乙個多重揹包問題,對於每乙個數量為ci的物品要是不用合併直接當ci個物品

用完全揹包的解法去解,結果肯定是超時的,所以就要用二進位制去優化,那怎麼用

二進位制進行優化呢?

將數量為ci個物品拆分為n個物品,每個物品分別是原來物品體積和價值的2^0

,2^1,2^2...2^k,ci-2^(k+1)+1倍。

例如當ci為14時,拆分的分別為

1,2,4,7。

那為什麼要這樣做呢?

因為乙個物品要麼全部放進揹包裡要不部分放進去要不就不放進去,那麼

就只需要

考慮部分的時候就行了,其他的不用考慮,當需要部分物品時則

能用這幾個數的一

部分相加得到。下面是**部分。

#include#includeusing namespace std;

int dp[50010],w[10010],p[10010];//w和p分別表示新組成的物品的體積和價值

int main()

51NOD 1086 揹包問題 V2

1086 揹包問題 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相對應的價值為p1,p2.pn pi為整數 求揹包能夠容納...

51nod1086 揹包問題 V2

我都快不會寫二進位制優化多重揹包了。卡了一下常數從rank100 到20 include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i ...

51Nod 1086揹包問題 V2

1086 揹包問題 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相對應的價值為p1,p2.pn pi為整數 求揹包能夠容納...