本人部分测试点WA,评测记录如下:
link
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
int ii,vi,ci,qi;
};node *a;
int *f;
bool bmp(node x,node y)
{
return x.qi<y.qi;
}
int ssum(int j,int i,int r,int o)
{
int ss;
switch(o)
{
case 1:
ss=(j>=a[i].vi+a[r].vi?a[i].ci+f[j-a[r].vi-a[i].vi]+a[r].ci:0);break;
case 2:
ss=(j>=a[i].vi+a[r+1].vi?a[i].ci+f[j-a[r+1].vi-a[i].vi]+a[r+1].ci:0);break;
case 3:
ss=(j>=a[i].vi+a[r].vi+a[r+1].vi?a[i].ci+f[j-a[i].vi-a[r].vi-a[r+1].vi]+a[r].ci+a[r+1].ci:0);break;
}
return ss;
}
int main()
{
scanf("%d%d",&n,&m);a=new node[m+1];
f=new int[n+1];int p;
memset(f,0,sizeof(int)*(n+1));
for(int i=1;i<=m;i++)
{
a[i].ii=i;
scanf("%d%d%d",&a[i].vi,&p,&a[i].qi);
a[i].ci=p*a[i].vi;
}
sort(a+1,a+m+1,bmp);
int t,r;
for(r=1;r<=m&&a[r].qi==0;r++); //找到第一个附件
t=r-1;
for(int i=1;i<=t;i++)
{
if(r<=m&&a[r].qi==a[i].ii) //有附件
{
if(r+1<=m&&a[r+1].qi==a[i].ii) //有两个附件
{
for(int j=n;j>=a[i].vi;j--)
{
f[j]=max(max(max(max(f[j],f[j-a[i].vi]+a[i].ci),ssum(j,i,r,1)),ssum(j,i,r,2)),ssum(j,i,r,3));
}
r+=2;
}
else //仅有一个附件
{
for(int j=n;j>=a[i].vi;j--)
{
if(j>=a[i].vi+a[r].vi)
f[j]=max(max(f[j],f[j-a[i].vi-a[r].vi]+a[i].ci+a[r].ci),f[j-a[i].vi]+a[i].ci);
else
f[j]=max(f[j],f[j-a[i].vi]+a[i].ci);
}
r++;
}
}
else //无附件
{
for(int j=n;j>=a[i].vi;j--)
f[j]=max(f[j],f[j-a[i].vi]+a[i].ci);
}
}
printf("%d\n",f[n]);
return 0;
}
感谢大佬相助!!!