ACM日记_17.7.22——多重背包模板

来源:互联网 发布:淘宝数据包导出 编辑:程序博客网 时间:2024/06/05 09:41
    #include <iostream>      #include<cstdio>      #include<cstring>      using namespace std;      int dp[100009],c[100009],w[100009],m[100009];      int n,M,t;      void zeropack(int cost,int weight)      {          for(int i=M;i>=cost;i--)              dp[i]=max(dp[i-cost]+weight,dp[i]);      }      void completepack(int cost,int weight)      {          for(int i=cost;i<=M;i++)              dp[i]=max(dp[i-cost]+weight,dp[i]);      }      void multipack(int cost,int weight,int num)      {          if(num*cost>=M)          {              completepack(cost,weight);              return;          }          int k=1;          while(k<num)          {              zeropack(k*cost,k*weight);              num-=k;              k*=2;          }                    zeropack(cost*num,weight*num);      }      int main()      {          //freopen("cin.txt","r",stdin);          while(~scanf("%d%d",&M,&n))          {              for(int i=1;i<=n;i++){scanf("%d%d",&m[i],&c[i]);w[i]=c[i];}              memset(dp,0,sizeof(dp));              for(int i=1;i<=n;i++)              {                  multipack(c[i],w[i],m[i]);              }              printf("%d\n",dp[M]);          }          return 0;      }  

原创粉丝点击