多重揹包問題:
有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 #include3view code4 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 }
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件...