多重背包暴力DP为$O(nV^2)$,n为物品个数,V为背包容量,二进制优化复杂度为$O(nV\log V)$。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 4 using namespace std;
 5 
 6 const int N=1010;
 7 int T,n,m,v,w,tot,f[N];
 8 
 9 int main(){
10     for (scanf("%d",&T); T--; ){
11         scanf("%d%d",&m,&n);
12         rep(i,0,m) f[i]=0;
13         rep(i,1,n){
14             scanf("%d%d%d",&v,&w,&tot);
15             for (int j=1; tot>=j; tot-=j,j<<=1)
16                 for (int k=m; k>=j*v; k--) f[k]=max(f[k],f[k-j*v]+j*w);
17             if (!tot) continue;
18             for (int k=m; k>=tot*v; k--) f[k]=max(f[k],f[k-tot*v]+tot*w);
19         }
20         printf("%d\n",f[m]);
21     }
22     return 0;
23 }
二进制优化

相关文章: