1 条题解

  • 0
    @ 2025-4-12 21:41:02

    C++ :

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int v[70],p[70],q[70],f[33000];
    int max(int a,int b){return a>b?a:b;}
    int main()
    {
        int n,m,i,j,k,t1,t2,k1,k2;
        int l=0;
        scanf("%d%d",&n,&m);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&v[i],&p[i],&q[i]);
        }
        for(i=1;i<=m;i++)
        {
            k1=k2=t1=t2=0;
            if(q[i]==0)//要是主物件
            {
                for(k=i+1;k<=m;k++)
                {
                    if(q[k]==i)//找到附属物品1
                    {
                        t1=k;
                        k1=1;
                        break;
                    }
                }
                for(k=t1+1;k<=m;k++)
                {
                    if(q[k]==i)//找到附属物品2
                    {
                        t2=k;
                        k2=1;
                        break;
                    }
                }
                for(j=n;j>=v[i];j--)
                {
                    f[j]=max(f[j-v[i]]+v[i]*p[i],f[j]);
                    f[j]=max(f[j-v[i]]+v[i]*p[i],f[j]);//只要主件或者都不要
                    if((j-v[i]-v[t1])>=0&&k1==1)//要附件1
                    f[j]=max(f[j-v[i]-v[t1]]+v[i]*p[i]+v[t1]*p[t1],f[j]);
                    if((j-v[i]-v[t2])>=0&&k2==1)//要附件2
                    f[j]=max(f[j-v[i]-v[t2]]+v[i]*p[i]+v[t2]*p[t2],f[j]);
                    if((j-v[i]-v[t1]-v[t2])>=0&&k1==1&&k2==1)
                    f[j]=max(f[j-v[i]-v[t1]-v[t2]]+v[i]*p[i]+v[t1]*p[t1]+v[t2]*p[t2],f[j]);
                }
            }
        }
        printf("%d\n",f[n]);
        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
    //assign(input,'budget.in');
    //reset(input);
    //assign(output,'budget.out');
    //rewrite(output);
    
    init;
    dp;
    writeln(f[n]);
    
    //close(input);
    //close(output);
    end.
    
    • 1

    信息

    ID
    1101
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者