1 条题解

  • 0
    @ 2021-6-15 1:39:09

    C++ :

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int N=40005,M=105;
    struct node{
    	int v,p,q,fn;
    	int fv[2],fp[2];
    };
    node a[M];
    int f[N]={0};
    int n,m;
    void init()
    {
    
    	cin>>n>>m;
    	memset(a,0,(m+1)*sizeof(node));
    	for(int i=1;i<=m;i++)
    	{
    		cin>>a[i].v>>a[i].p>>a[i].q;
    		if(a[i].q)
    		{
    			int k=a[a[i].q].fn;
    			a[a[i].q].fv[k]=a[i].v;
    			a[a[i].q].fp[k]=a[i].p;
    			a[a[i].q].fn++;
    		}
    	}
    }
    int main()
    {
    	init();
    	for(int i=1;i<=m;i++)
    		if(a[i].q==0)
    			for(int j=n;j>=a[i].v;j--)
    			{
    				f[j]=max(f[j],f[j-a[i].v]+a[i].v*a[i].p);
    				if(a[i].fn>=1&&j>=a[i].v+a[i].fv[0])
    				  f[j]=max(f[j],f[j-a[i].v-a[i].fv[0]]+a[i].v*a[i].p+a[i].fv[0]*a[i].fp[0]);
    				if(a[i].fn>1&&j>=a[i].v+a[i].fv[1])
    				  f[j]=max(f[j],f[j-a[i].v-a[i].fv[1]]+a[i].v*a[i].p+a[i].fv[1]*a[i].fp[1]);
    				if(a[i].fn>1&&j>=a[i].v+a[i].fv[0]+a[i].fv[1])
    				  f[j]=max(f[j],f[j-a[i].v-a[i].fv[0]-a[i].fv[1]]+a[i].v*a[i].p
    					+a[i].fv[0]*a[i].fp[0]+a[i].fv[1]*a[i].fp[1]);
    			}
    	cout<<f[n]<<endl;
    	return 0;
    }
    

    Pascal :

    var
    n,m:longint;
    newv,newp:array[-1000..maxint] of longint;
    v,p,q:array[-1000..maxint] of longint;
    f:array[-1000..maxint] of longint;
    function calc(k:longint):longint;
    var
    i,j,x:longint;
    begin
    x:=1;
    newv[1]:=v[k];
    newp[1]:=p[k];
    for i:=1 to m do
    if q[i]=k then
    begin
    for j:=1 to x do
    begin
    newv[j+x]:=newv[j]+v[i];
    newp[j+x]:=newp[j]+p[i];
    end;
    x:=x*2;
    end;
    exit(x);
    end;
    procedure dp;
    var
    i,j,k,temp:longint;
    begin
    fillchar(f,sizeof(f),0);
    for i:=1 to m do
    begin
    if q[i]<>0 then continue;
    for j:=n downto 1 do
    for k:=1 to calc(i) do
    if j>=newv[k] then
    if (f[j]<f[j-newv[k]]+newp[k]) then f[j]:=f[j-newv[k]]+newp[k];
    end;
    end;
    procedure init;
    var
    i:longint;
    begin
    read(n,m);
    for i:=1 to m do
    begin
    read(v[i],p[i],q[i]);
    p[i]:=p[i]*v[i];
    end;
    end;
    begin
    init;
    dp;
    writeln(f[n]);
    end.
    
    • 1

    信息

    ID
    250
    时间
    1000ms
    内存
    125MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者