P1776 寶物篩選(多重揹包)

2022-04-06 15:03:48 字數 1068 閱讀 1886

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.如果你學過揹包九講演算法,這裡就顯得比板子還要板子了吧...