玄学O2O3,仅用200ms,以 多重背包问题Ⅱ的方法碾压1000ms的单调队列优化!
这样实现的:
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
using namespace std ;
const int N=1000010 ;
int a,b,s ;
int n,m ;
int cnt ;
int f[N] ;
int w[N],v[N] ;
int main()
{
scanf("%d%d",&n,&m) ;
while(n--)
{
scanf("%d%d%d",&a,&b,&s) ;
for(int i=1;i<=s;i*=2)
{
v[++cnt]=a*i ;
w[cnt]=b*i ;
s-=i ;
}
if(s)
{
v[++cnt]=a*s ;
w[cnt]=b*s ;
}
}
n=cnt ;
for(int i=1;i<=n;i++)
for(int j=m;j>=v[i];j--)
f[j]=max(f[j],f[j-v[i]]+w[i]) ;
printf("%d",f[m]) ;
return 0 ;
}
看代码前两行,发现了什么?
玄学的发现最后多重背包2也能用多重背包1+O2O3优化卡过去。
$$\color{red}{\mathtt{Try\ this!!!}}$$
艹
给大佬跪下了
but i am only a juruo
哦嚯嚯玄学啊