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

    朴素版本:

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

    一维数组优化版本(类01背包):

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1005;
    int dp[maxn];
    int v[maxn][maxn],w[maxn][maxn],s[maxn];
    int main(){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d",&s[i]);
            for(int j=1;j<=s[i];j++){
                scanf("%d%d",&v[i][j],&w[i][j]);
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=m;j>=0;j--){
                for(int k=1;k<=s[i];k++){
                    if(j>=v[i][k]) dp[j]=max(dp[j],dp[j-v[i][k]]+w[i][k]);
                }
            }
        }
        printf("%d
    ",dp[m]);
    } 
    View Code
    Codeforces ID:Anonytt QQ: 847399102 可以添加&关注
  • 相关阅读:
    js验证身份证号,超准确
    C#对象序列化与反序列化
    寒冰王座[HDU1248]
    A C[HDU1570]
    循环多少次?[HDU1799]
    Play on Words[HDU1116]
    Fengshui-[SZU_B40]
    Travel Problem[SZU_K28]
    Big Event in HDU[HDU1171]
    Count the Trees[HDU1131]
  • 原文地址:https://www.cnblogs.com/Anonytt/p/14369652.html
Copyright © 2011-2022 走看看