多重揹包優化(二進位制)
/*1.怎麼把多重揹包問題轉換為01揹包問題
v,w拆開重複s份放到陣列裡面去,每個物品只能用一次
=> 二進位制拆法
7 7以內選多少個數可以使得7中所有的數都可以組合出來 0-7
1 1 1 1 1 1 1
1 2 401
23 = 1 + 2
4 = 4
5 = 1 + 4
6 = 2 + 4
7 = 1 + 2 + 4
給定乙個數s,用多少個數可以表示小於等於s的所有數 答案 log2(s)上取整
s = 10
1 2 4 3
1 2 7 :0-7
3: 0-10
s - 1 - 2 - 4 - 8 分成了log(s)份
1000*log(2000)*2000 = 1000*11*2000 = 2 * 10^7
*/#include
#include
#include
#include
using
namespace
std;
const
int num = 2010
;int
n, v;
intdp[num];
//定義結構體 v體積,w表示**
struct
good;
intmain()
);//
放到物品組中去
}
if (n>0
) goods.push_back();//
剩餘的}
//01揹包求最大價值
for(auto good:goods)
for (int j = v; j >= good.v; j--)
cout
<< dp[v] <
return0;
}
多重揹包問題 II
有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi...
多重揹包問題II
多重揹包問題ii 總體積是m,每個小物品的體積是a i 每個小物品的數量是b i 每個小物品的價值是c i 求能夠放入揹包內的最大物品能夠獲得的最大價值 和上乙個很類似 上一題體積就是價值,這裡的價值是單獨定義了 狀態轉移方程 不放a i f i j f i 1 j 放a j 可放多個設為k,k m...
多重揹包問題 II
有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi...