51Nod(1086)

来源:互联网 发布:海文网络计划软件教程 编辑:程序博客网 时间:2024/06/02 02:08

多重背包板子题。

我要重新练dp了大哭,好特么菜。

    #include <iostream>      #include<bits/stdc++.h>      using namespace std;            int d[55000],n,m;            void zeroonepack(int w,int p)      {          for(int i=m;i>=w;i--)              if(d[i]<d[i-w]+p)   d[i]=d[i-w]+p;      }            void completepack(int w,int p)      {          for(int i=w;i<=m;i++)              if(d[i]<d[i-w]+p)   d[i]=d[i-w]+p;      }            void multipack(int w,int p,int c)      {          if(w*c>=m)  completepack(w,p);          else          {              int k=1;              while(k<c)              {                  zeroonepack(k*w,k*p);                  c-=k;                  k*=2;              }              zeroonepack(c*w,c*p);          }      }            int main()      {          while(~scanf("%d%d",&n,&m))          {              memset(d,0,sizeof(d));              for(int i=0;i<n;i++)              {                  int w,p,c;                  scanf("%d%d%d",&w,&p,&c);                  multipack(w,p,c);              }              cout<<d[m]<<endl;          }      }