O V n 的多重揹包問題

2022-06-01 10:12:10 字數 1124 閱讀 1675

多重揹包問題:

有n件物品,第i件價值為wi,質量為vi,有c1件,問,給定容量v,求獲得的最大價值。

樸素做法:

視為0,1,2,...,k種物品的分組揹包 [每組只能選乙個]

f[i][j]=max(f[i][j-k*v[i]]+k*w[i])

但是i,j,k都要列舉,複雜度為 n*v*k

樸素做法的改進:

因為發現用二進位制可以表示1..k之內的所有數 [整數二進位制開啟後為01串,所以可以被二進位制表示]

所以將k個物品拆分成1,2,4...2^m,k-2^m   ( 其中2^m<=k<2^(m+1) ) 這些物品,然後變成01揹包問題。

但是n的數目增多了,複雜度為 n*v*logk

利用單調佇列的改進:

1.我們可以發現每個容量都能表示成 v*x+d 的形式[ v表示當前考慮的物品的容量 ]

2.在上一點的啟發下,我們發現乙個f[v*x+d]在考慮當前物品時,只能由f[v*y+d]轉移而來。 [其中x-y<=k]。

也就是說,對v取模的餘數相同的容量之間才能互相轉移,而且要求x-y<=k。又因為求的是最大值的轉移,所以滿足單調佇列的適用性。

於是乎,我們對於餘數d相同的容量分別建乙個單調佇列,然後列舉x f[x*v+d],進行轉移即可。

1 #include2 #include3

4 inline int

in()

1112

int a[200005],b[200005],f[200005

];13

intw,v,k,n,v,l,r;

1415

void insert(int x,int

y)19

20 inline int max(int a,int

b)23

24int

main()

34else

if(k<0)39

if(v/vv;

40for(int d=0;d)47}

48}49 printf("%d"

,f[v]);

50return0;

51 }

view code

codevs 3269 混合揹包

ac通道:

多維多重揹包問題 多重揹包問題

悼念512汶川大 遇難同胞 珍惜現在,感恩生活 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...

揹包問題 多重揹包

有n種物品和乙個容量為w的揹包。第i種物品最多有n i 件可用,每件重量是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。1.使用三重迴圈進行遞推 狀態轉移式為 dp i j max 關鍵 如下 void solve printf d n dp n ...

多重揹包問題

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這題目和完全揹包問題很類似。基本的方程只需將完全揹包問題的方程略微一改即可,因為對於第i種物品有n i 1種策略 取0件,取1件...