说来惭愧 这么easy的题目 我居然看代码的时候还是抱着惯性思维去看 写题目的时候也感觉自己被束缚了
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
struct node{
int w,p;
};
const int maxn = 1e3 + 10;
int dp[maxn];
vector<vector<node> > vec;
int main(){
int n,m;
cin >> m >> n;
vec.resize(100 + 10);
for(int i = 0 ; i< n ; ++i){
int w,p,g;
cin >> w >> p >> g;
vec[g].push_back(node{w,p});
}
for(auto it : vec){ //groups
for(int v = m ;v>=0 ;v--){
for(auto item : it){ //item in group
if(v >= item.w){
dp[v] = max(dp[v],dp[v - item.w] + item.p);
}
}
}
}
cout << dp[m] << endl;
return 0;
}
通常我们写题目都会让每一个商品都走一遍全程,分组背包则是让每一个格子中每一个商品都走一遍。