miku
多重揹包板子
純多重揹包好想》\(dp[i]=max\\)
但是要優化。這裡採用二進位制優化。
二進位制優化是啥呢,假如i物品有13個
13可以拆成1+2+4+6,然後用這四個,就可以表示除1-13所有可能了
這樣就把多重揹包優化成了01揹包
#include#includeusing namespace std;
int n,m;
int w[100001];
int v[100001];
int dp[100001];
int x,y,z;
int cnt;
int main()
if(z)
} for(int i=1;i<=cnt;++i)
} cout<---------------、
再來個單調佇列的
單調佇列不好理解,最麻煩的事狀態轉移方程的轉化
原來是\(f_j=max\ +k*w\}\)
把j換成a*w+d則
\(f_j=max\ +k*w\}\)
然後再改變一下\(f_j=max\ +k*w-a*w\}+a*w\)
就是\(f_j=max\ -(a-k)*w\}+a*w\)
哇哦,a-k出現了兩邊,並且如果我們按照%v的餘數來分組。a-k就是在新分的組中的編號
然後就可以用單調佇列解決了
#include#include#include#includeusing namespace std;
int m,n,ans;
deque q,q2;
int dp[40010];
int w,v,c,k;
int main()
q.push_back(z);
q2.push_back(dp[j+z*v]-z*w);//可轉移
while(!q.empty()&&q.front()dp[j+z*v]=max(dp[j+z*v],q2.front()+z*w);
}} }
cout
}
洛谷P1776 寶物篩選 題解 多重揹包
題目大意 這道題目是一道多重揹包的模板題。首先告訴你 n 件物品和揹包的容量 v 然後分別告訴你 n 件物品的價值 w 體積 c 以及數量 m 求解這個揹包能夠裝載的最大價值是多少?解題思路 直接套多重揹包的模板解決這個問題。注意這裡的多重揹包使用了二進位制優化。實現 如下 include usin...
洛谷P1776 寶物篩選
當年在tb桌前跪著聽懂了單調佇列優化多重揹包 然後那天下午codevs上的多重揹包一直過不去 現在codevs沒了,時間過得真快,有點心酸,當年bzoj也不知道,全在codevs上做題,好多 記錄都沒了。今天突然發現這題補掉,舒服了 includeusing namespace std const ...
P1776 寶物篩選 題解
同步 原題鏈結 簡要題意 多重揹包模板。即給定 n nn 個物品和乙個容積為 v vv 的揹包,每件物品有價值 v iv i vi 重量 w iw i wi 和個數 g ig i gi 求最大價值。n 1 05 n leq 10 5 n 105.如果你學過揹包九講演算法,這裡就顯得比板子還要板子了吧...