多重背包暴力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 }