codevs5429(單調佇列優化多重揹包)
阿新 • • 發佈:2018-12-11
其實這個知識點並不是很難。。只是覺得並不會這麼極限卡log就沒去管他。。直到今天差點被卡TAT
稍微推導一下
設d[i][j]為前i種物品體積為j的最大價值
此時
令,,有
此時即
然後考慮到列舉k的時候k一定為整數,所以直接就行。。然後發現這就是劃窗。。
所以列舉q後列舉k,然後直接單調佇列維護最值即可。。
然後時間複雜度降成了O(nm)而且好像並不比二進位制壓縮複雜多少。。所以以後就寫單調隊列了。。
/** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ┃ * ┃ > < ┃ * ┃ ┃ * ┃... ⌒ ... ┃ * ┃ ┃ * ┗━┓ ┏━┛ * ┃ ┃ Code is far away from bug with the animal protecting * ┃ ┃ 神獸保佑,程式碼無bug * ┃ ┃ * ┃ ┃ * ┃ ┃ * ┃ ┃ * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ */ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<set> #include<bitset> #include<stdlib.h> #include<assert.h> #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,l,r) for(int i=l;i>=r;i--) #define link(x) for(edge *j=h[x];j;j=j->next) #define mem(a) memset(a,1,sizeof(a)) #define ll long long #define eps 1e-8 #define succ(x) (1<<x) #define lowbit(x) (x&(-x)) #define sqr(x) ((x)*(x)) #define mid (x+y>>1) #define NM 7005 #define nm 7005 #define pi 1.1415926535897931 const int inf=1e9+7; using namespace std; ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=0;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; } int n,m,c[NM],w[NM],b[NM],qh,qt,q[NM]; int d[NM],f[NM]; int main(){ n=read();m=read(); inc(i,1,n)c[i]=read(),w[i]=read(),b[i]=read(); inc(i,1,n){ inc(j,0,c[i]-1){ qh=1;qt=0; for(int k=0;j+k*c[i]<=m;k++){ while(qh<=qt&&q[qh]<k-b[i])qh++; while(qh<=qt&&f[j+q[qt]*c[i]]-q[qt]*w[i]<=f[j+k*c[i]]-k*w[i])qt--; q[++qt]=k; d[j+k*c[i]]=f[j+q[qh]*c[i]]-q[qh]*w[i]+k*w[i]; } } inc(i,1,m)f[i]=d[i]; } return 0*printf("%d\n",d[m]); }
5429 多重揹包
時間限制: 1 s
空間限制: 256000 KB
題目等級 : 鑽石 Diamond
題目描述 Description
你有一個容量為M的揹包,和N種物品。
每種物品都有三個屬性,vi,wi,與ci,分別表示這種物品的體積、價值和件數。
你的任務是,從這些所給物品中,選出若干件,其體積之和不能超過揹包容量,並且使所選物品的權值的和最大。
輸入描述 Input Description
第一行兩個整數N,M
接下來N行每行三個數vi,wi,ci描述第i件物品的屬性
輸出描述 Output Description
最大的權值和
樣例輸入 Sample Input
2 8
2 100 4
4 100 2
樣例輸出 Sample Output
400
資料範圍及提示 Data Size & Hint
對於20%的資料,ci=1
對於60%的資料,N,M<=500,ci<=100
對於90%的資料,N,M<=3000
對於100%的資料,N,M<=7000,ci<=5000,保證答案不超過2147483647