先给dalao理解我的代码(变量有点乱请谅解)
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstring>
#include<map>
#include<cstdio>
using namespace std;
const int N=1e4+10;
int m,n,t,x;
int g[205][205];
int w[N],z[N],b[N],dp[N];
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++){
cin>>w[i]>>z[i]>>x;
t=max(t,x);
b[x]++;
g[x][b[x]]=i;
}
for(int i=1;i<=t;i++){
for(int j=m;j>=0;j--){
for(int k=1;k<=b[i];k++){
if(j>=w[g[i][k]]){
dp[j]=max(dp[j],dp[j-w[g[i][k]]]+z[g[i][k]]);
}
}
}
}
cout<<dp[m];
return 0;
}
附上我的问题:三个for循环那里的第二个循环为什么不像01背包滚动下限为w[i],而是将下限设到0呢?(前者只会得4分)