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 }
    混合背包(没啥好优化的)
  • 相关阅读:
    Longest Palindromic Substring
    PayPal MLSE job description
    Continuous Median
    Remove Duplicates From Linked List
    Valid IP Address
    Longest substring without duplication
    Largest range
    Subarray sort
    Multi String Search
    Suffix Trie Construction
  • 原文地址:https://www.cnblogs.com/Fraction/p/BagTellingTwo.html
Copyright © 2011-2022 走看看