屈ll子 @ 2019-11-08 19:38:27
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
const int maxn=10000;
int n,V;
int f[1000000];
int s[maxn],w[maxn],d[maxn],dp[maxn][5],v[maxn];
int main()
{
memset(f,0,sizeof(f));
memset(v,0,sizeof(v));
memset(dp,0,sizeof(dp));
scanf("%d%d",&V,&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&s[i],&w[i],&d[i]);
w[i]*=s[i];
if(d[i])dp[d[i]][++v[d[i]]]=i;
}
// cout<<dp[1][v[1]];
for(int i=1;i<=n;i++)
{
// cout<<i<<"+++"<<endl;
if(d[i])continue;
for(int j=V;j>=s[i];j--)
f[j]=max(f[j],f[j-s[i]]+w[i]);
if(v[i]){
int fu1=dp[i][1];
int fu2=dp[i][2];
// cout<<fu1<<" "<<fu2<<endl;
for(int j=V;j>=s[i];j--)
{
if(j-s[i]-s[fu1]>=0&&fu1)
f[j]=max(f[j],f[j-s[i]-s[fu1]]+w[i]+w[fu1]);
if(j-s[i]-s[fu2]>=0&&fu2)
f[j]=max(f[j],f[j-s[i]-s[fu2]]+w[i]+w[fu2]);
if(j-s[i]-s[fu1]-s[fu2]>=0&&fu1&&fu2)
f[j]=max(f[j],f[j-s[i]-s[fu1]-s[fu2]]+w[i]+w[fu1]+w[fu2]);
}
}
}
int ans=0;
for(int i=1;i<=V;i++)
ans=max(ans,f[i]);
cout<<ans<<endl;
return 0;
}
by Axurez @ 2020-01-04 23:42:29
有没有 v[i] 的两个 for(int j=V;j>=s[i];j--) 循环应该合并起来,不然会干扰的。