题目背景
直达通天路·小 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 ",ans); }