【洛谷】分组背包 P1757 通天之分组背包

P1757 通天之分组背包

题目大意

现在有 (n) 个物品,每个物品有三个属性 (w,v,id),分别表示这个物品的 重量 价值 以及所属的组。

给出容量为 (m) 的背包,同一个组的物品最多取一个,问可以取得的最大值。

题解

分组背包模板题。

注意:先枚举背包容量,再枚举同一个组中的物品

代码

#include<bits/stdc++.h>
using namespace std;

#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int seed=233;
const int N=1e3+10;

vector<pair<int,int>>vec[N];
int dp[N];
int main()
{
    int n,m;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        vec[c].pb(make_pair(a,b));
    }
    for(int i=1;i<=n;i++){
        if(!vec[i].size()) continue;
        for(int j=m;j>=0;j--){
            for(int k=0;k<vec[i].size();k++){
                if(j>=vec[i][k].first) 
                    dp[j]=max(dp[j],dp[j-vec[i][k].first]+vec[i][k].second);
            }
        }
    }
    printf("%d
",dp[m]);
    return 0;
}

原文地址:https://www.cnblogs.com/valk3/p/14070806.html