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

    朴素无优化版本:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+5;
    int dp[maxn][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]);
        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                for(int k=0;k*v[i]<=j&&k<=s[i];k++){
                    dp[i][j]=max(dp[i][j],dp[i-1][j-k*v[i]]+k*w[i]);
                }
            }
        }
        cout<<dp[n][m]<<endl;
    } 
    View Code

    优化版本(1维数组):

    #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]);
        for(int i=1;i<=n;i++){
            for(int j=m;j>=0;j--){
                for(int k=1;k*v[i]<=j&&k<=s[i];k++){
                    dp[j]=max(dp[j],dp[j-k*v[i]]+k*w[i]);
                }
            }
        }
        cout<<dp[m]<<endl;
    } 
    View Code

     

    二进制版本优化:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=12005;
    int dp[maxn];
    int v[maxn],w[maxn];
    int main(){
        int n,m;scanf("%d%d",&n,&m);
        int cnt=0;
        for(int i=1;i<=n;i++){
            int a,b,s;scanf("%d%d%d",&a,&b,&s);
            int k=1;
            while(k<=s){
                cnt+=1;
                v[cnt]=a*k,w[cnt]=b*k;
                s-=k;k*=2;
            }
            if(s>0){
                cnt+=1;
                v[cnt]=a*s,w[cnt]=b*s;
            }
        }
        n=cnt;
        for(int i=1;i<=n;i++){
            for(int j=m;j>=v[i];j--){
                dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
            }
        }
        cout<<dp[m]<<endl;
    } 
    View Code
    Codeforces ID:Anonytt QQ: 847399102 可以添加&关注
  • 相关阅读:
    Linux指令面试题01-进程查看与终止
    微信网页授权
    腾讯视频怎么转成mp4模式 软件 工具 方法 最新【已解决】
    表操作,多对一、多对多、一对一
    初识数据库,基础sql语句
    IO多路复用
    协程:gevent
    线程:threading
    进程:multiprocessing
    利用socket与ssl模块读取网页内容
  • 原文地址:https://www.cnblogs.com/Anonytt/p/14368898.html
Copyright © 2011-2022 走看看