zoukankan      html  css  js  c++  java
  • 【背包九讲专题】混合背包

    不优化朴素解法,01背包看出S=1,完全背包看成S=INF,再跑多重背包(时间复杂度高,3层for循环):

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+5;
    int dp[maxn];
    int v[maxn],w[maxn],s[maxn];
    int main(){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&v[i],&w[i],&s[i]);
            if(s[i]==-1) s[i]=1;
            else if(s[i]==0) s[i]=maxn;
        }
        for(int i=1;i<=n;i++){
            for(int j=m;j>=v[i];j--){
                for(int k=0;k<=s[i]&&k*v[i]<=j;k++){
                    dp[j]=max(dp[j],dp[j-k*v[i]]+k*w[i]);
                }
            }
        }
        printf("%d
    ",dp[m]);
    } 
    View Code

    二进制优化多重背包,各跑完全/01背包(2层for循环):

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+5;
    int dp[maxn];
    struct node{
        int v,w;
    };
    int main(){
        vector<node> goods;
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            int v,w,s;scanf("%d%d%d",&v,&w,&s);
            if(s==-1) s=1;
            else if(s==0) s=maxn;
            for(int k=1;k<=s;k*=2){
                s-=k;
                goods.push_back({k*v,k*w});
            }
            if(s>0) goods.push_back({s*v,s*w});
        }
        for(auto it:goods){
            for(int j=m;j>=it.v;j--){
                dp[j]=max(dp[j],dp[j-it.v]+it.w);
            }
        }
        printf("%d
    ",dp[m]);
    } 
    View Code
    Codeforces ID:Anonytt QQ: 847399102 可以添加&关注
  • 相关阅读:
    CSS display使用
    WPF触发器
    WPF动画2
    WPF动画2
    WPF 动画1
    CSS 媒体查询
    [Leetcode] Rotate List
    [Leetcode] Add Two Numbers
    [Leetcode] Sort List
    [Leetcode] Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/Anonytt/p/14374585.html
Copyright © 2011-2022 走看看