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 可以添加&关注
  • 相关阅读:
    2101 可达性统计
    POJ1179 Polygon
    POJ1015 Jury Compromise
    读入输出优化
    队列优化dijsktra(SPFA)的玄学优化
    5104 I-country
    CH5102 Mobile Service
    P1005 矩阵取数游戏
    (模板)线段树2
    POJ3666 Making the Grade
  • 原文地址:https://www.cnblogs.com/Anonytt/p/14369652.html
Copyright © 2011-2022 走看看