复杂度 n^2 * logn

 

 类似倍增, 将 num[i] 拆为 1+2+4+ .... ,这样取物品i 时,可以一次多取一些

 #include <iostream>
 #include <cstring>
 #include <algorithm>
 using namespace std; 
  const int N=600,M=1e4;
  int n,m,w[N],v[N],p[N],f[M];
  void sov(){
      int i,j,k;
      for(i=1;i<=n;i++){
          int t=p[i];
          for(k=1;k<=t;k<<=1){
              for(j=m;j>=k*w[i];j--){
                 f[j]=max(f[j],f[j-k*w[i]]+k*v[i]);
               }
            t-=k;
          }
          if(t){
              for(j=m;j>=t*w[i];j--)
                f[j]=max(f[j],f[j-t*w[i]]+t*v[i]);
          }
      }
      cout<<f[m];
  }
 signed main(){
     cin>>n>>m; 
     for(int i=1;i<=n;i++) cin>>w[i]>>v[i]>>p[i];
     sov();
 }
 
 
 

 

posted on 2022-12-07 15:44  towboat  阅读(28)  评论(0)    收藏  举报