1. 程式人生 > 實用技巧 >【洛谷】分組揹包 P1757 通天之分組揹包

【洛谷】分組揹包 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\n",dp[m]);
    return 0;
}