P1757 通天之分组背包(分组背包)

题目背景

直达通天路·小 A 历险记第二篇

题目描述

自 0101 背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 0101 背包,他的物品大致可分为 kk 组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。

输入格式

两个数 m,nm,n,表示一共有 nn 件物品,总重量为 mm。

接下来 nn 行,每行 33 个数 a_i,b_i,c_iai,bi,ci,表示物品的重量,利用价值,所属组数。

输出格式

一个数,最大的利用价值。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int n,m;
int dp[maxn][maxn];
int c[maxn];
int w[maxn];
int b[maxn];
vector<pair<int,int>> g[maxn];
int main () {
    scanf("%d%d",&m,&n);
    for (int i=1;i<=n;i++) {
        scanf("%d%d%d",c+i,w+i,b+i);
        g[b[i]].push_back(make_pair(c[i],w[i])); 
    }
    for (int i=1;i<=1000;i++) {
        for (int j=0;j<g[i].size();j++) {
            for (int k=m;k>=g[i][j].first;k--)
                dp[i][k]=max(dp[i][k],dp[i-1][k-g[i][j].first]+g[i][j].second);
        }
    }
    int ans=0;
    for (int i=1;i<=1000;i++)
        for (int j=0;j<=m;j++) ans=max(ans,dp[i][j]);
    printf("%d\n",ans);
}

 

posted @ 2020-08-07 16:29  zlc0405  阅读(203)  评论(0编辑  收藏  举报