代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxw = 32005;
const int maxn = 65;
int w[maxn];
int v[maxn];
int t[maxn];
int dp[maxw];
int sub_dp[maxw];
int Athing[maxn];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int W,num;
cin>>W>>num;
int Anum = 0;
for(int i=1;i<=num;i++){
int tp;
cin>>w[i]>>tp>>t[i];
v[i] = w[i]*tp;
if(!t[i])
Athing[++Anum] = i;
}
for(int k=1;k<=Anum;k++){
memcpy(sub_dp,dp,sizeof(dp));
int cur = Athing[k];
for(int i=1;i<=num;i++){
if(t[i] == cur)
{
for(int j=W;j>=w[i];j--)
sub_dp[j] = max(sub_dp[j] , sub_dp[j - w[i]] + v[i]);
}
}
for(int j = W ; j >= w[cur] ; j--)
sub_dp[j] = sub_dp[j - w[cur]] + v[cur];
for(int j = w[cur] ; j <= W ; j++)
dp[j] = max(dp[j] , sub_dp[j]);
}
cout<<dp[W]<<endl;
return 0;
}