_JF_ @ 2023-08-18 13:28:02
调了很久无果
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4e4;
vector<int> g[N];
int dp[70][N],v[N],w[N],q[N],Max;
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>v[i]>>w[i]>>q[i];
for(int i=1;i<=m;i++){
if(q[i]==0){
Max++,g[Max].push_back(i);
for(int j=1;j<=m;j++) if(q[j]==i) g[Max].push_back(j);
}
}
for(int i=1;i<=Max;i++) sort(g[i].begin()+1,g[i].end());
bool f=true;
for(int i=1;i<=Max;i++){
// slove that only one
if(g[i].size()==1){
int Now=g[i][0];
for(int k=n;k>=v[Now];k--){
dp[i][k]=max(max(dp[i-1][k],dp[i][k]),max(dp[i][k-v[Now]],dp[i-1][k-v[Now]])+v[Now]*w[Now]);
}
for(int k=v[Now]-1;k>=0;k--)
dp[i][k]=dp[i-1][k];
continue;
}
// Slove the others expect first
for(int j=1;j<g[i].size();j++){
int now=g[i][j];
for(int k=n;k>=v[now];k--)
dp[i][k]=max(max(dp[i][k],dp[i-1][k]),max(dp[i][k-v[now]],dp[i-1][k-v[now]])+v[now]*w[now]);
}
// clear the unuse
for(int j=n;j>=0;j--){
if(j+v[g[i][0]]>n) dp[i][j]=dp[i-1][j];
else{
dp[i][j+v[g[i][0]]]=max(max(dp[i-1][j+v[g[i][0]]],dp[i][j+v[g[i][0]]]),dp[i][j]+v[g[i][0]]*w[g[i][0]]),dp[i][j]=dp[i-1][j];
}
}
}
int ans=0;
for(int i=1;i<=Max;i++){
for(int j=n;j>=0;j--)
ans=max(ans,dp[i][j]);
// cout<<ans<<endl;
}
cout<<ans<<endl;
}
by protractor @ 2023-08-20 22:13:30
最后两个点?