zoukankan      html  css  js  c++  java
  • 蒟蒻吃药计划-治疗系列 #round4 多重背包+混合背包代码存放

     1 #include <bits/stdc++.h>
     2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i)
     3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i)
     4 using namespace std;
     5 int v[1000+20],w[1000+20],s[1000+20];
     6 int dp[1000+20];
     7 int n,m;
     8 inline int botposs(int a,int b,int pd){
     9     if(pd==1) return a>b?a:b;
    10     if(pd==0) return a<b?a:b;
    11 }
    12 int main(){
    13     scanf("%d%d",&n,&m);
    14     fp(i,1,n){
    15         scanf("%d%d%d",&v[i],&w[i],&s[i]);
    16     }
    17     fp(i,1,n){
    18         fd(j,m,0){
    19             fp(k,0,s[i]){
    20                 if(j-k*v[i]<0){
    21                     break;
    22                 }
    23                 dp[j]=botposs(dp[j],dp[j-k*v[i]]+k*w[i],1);
    24             }
    25         }
    26     }
    27     printf("%d",dp[m]);
    28     return 0;
    29 }
    多重背包(空间优化O(v))
     1 #include <bits/stdc++.h>
     2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i)
     3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i)
     4 using namespace std;
     5 int v[1000+20],w[1000+20];
     6 int dp[1000+20];
     7 int n,m,n1;
     8 inline int botposs(int a,int b,int pd){
     9     if(pd==1) return a>b?a:b;
    10     if(pd==0) return a<b?a:b;
    11 }
    12 int main(){
    13     scanf("%d%d",&n,&m);
    14     int x,y,s,t=1;
    15     fp(i,1,n){ 
    16         scanf("%d%d%d",&x,&y,&s);
    17         while(s>=t){
    18             v[++n1]=x*t;
    19             w[n1]=y*t;
    20             s-=t;
    21             t*=2;
    22         }
    23         v[++n1]=x*s;
    24         w[n1]=y*s;
    25     }
    26     fp(i,1,n1){
    27         fd(j,m,v[i]){
    28             dp[j]=botposs(dp[j],dp[j-v[i]]+w[i],1);
    29         }
    30     }
    31     printf("%d",dp[m]);
    32     return 0;
    33 }
    多重背包(终极优化)

    (其实不是很终极辣)

     1 #include <bits/stdc++.h>
     2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i)
     3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i)
     4 using namespace std;
     5 int c[1000+20],w[1000+20],p[1000+20];
     6 int dp[1000+20];
     7 int n,m,n1;
     8 inline int botposs(int a,int b,int pd){
     9     if(pd==1) return a>b?a:b;
    10     if(pd==0) return a<b?a:b;
    11 }
    12 int main(){
    13     scanf("%d%d",&m,&n);
    14     fp(i,1,n){
    15         scanf("%d%d%d",&w[i],&c[i],&p[i]);
    16     }
    17     fp(i,1,n){
    18         if(p[i]==0){
    19             fp(j,w[i],m){
    20                 dp[j]=botposs(dp[j],dp[j-w[i]]+c[i],1);
    21             }
    22         }
    23         else{
    24             fp(j,1,p[i]){
    25                 fd(k,m,w[i]){
    26                     dp[k]=botposs(dp[k],dp[k-w[i]]+c[i],1);
    27                 }
    28             }
    29         }
    30     }
    31     printf("%d",dp[m]);
    32     return 0;
    33 }
    混合背包(没啥好优化的)
  • 相关阅读:
    java操作生成jar包 和写入jar包
    jboss配置jndi连接池
    windows 域的LDAP查询相关举例
    LDAP error Code 及解决方法
    HDU 6417
    CF1299D Around the World
    codechef Chef and The Colored Grid
    Educational Codeforces Round 82 (Rated for Div. 2)
    CF1237F Balanced Domino Placements
    CF1254E Send Tree to Charlie
  • 原文地址:https://www.cnblogs.com/Fraction/p/BagTellingTwo.html
Copyright © 2011-2022 走看看