P1064 [NOIP2006 提高组] 金明的预算方案 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m;
int f[N],g[N],v[N],w[N],team[N];
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
v[i]=a,w[i]=a*b,team[i]=c;
}
for(int i=1;i<=m;i++){
if(team[i]==0){
for(int j=1;j<v[i];j++) g[j]=0;
for(int j=v[i];j<=n;j++){
g[j]=f[j-v[i]]+w[i];
}
for(int j=1;j<=m;j++){
if(team[j]==i){
for(int k=n;k>=v[i]+v[j];k--){
g[k]=max(g[k],g[k-v[j]]+w[j]);
}
}
}
for(int j=v[i];j<=n;j++) f[j]=max(f[j],g[j]);
}
}
printf("%d\n",f[n]);
}