前言
思路
传统的多重背包
O
n
3
O n^3
On3
二进制优化
O
n
2
l
o
g
n
O n^2logn
On2logn
使用单调队列优化
O
N
V
O NV
ONV
算法只不过是工具,一切围绕目的不放开
Mycode
const int N = 1010, M = 20010;
int n,m;
int v[N],w[N],s[N];
int f[N],g[M];
int q[M];
void solve(){
cin>>n>>m;
//体积 价值 数量
for(int i=1;i<=n;i++) cin>>v[i]>>w[i]>>s[i];
for(int i=1;i<=n;i++){
memcpy(g,f,sizeof g);
for(int r = 0 ; r<v[i]; ++ r){
int hh = 0 , tt=-1;
for(int j = r;j<=m;j+=v[i]){
while(hh<=tt && j-q[hh] > s[i]*v[i]) hh++;
while(hh<=tt && g[q[tt]] + (j-q[tt])/v[i]*w[i] <= g[j]) --tt;
q[++tt] = j;
f[j] = g[q[hh]] + (j - q[hh])/v[i]*w[i];
}
}
}
cout<<f[m]<<endl;
}