Value

Description

这里写图片描述

Data Constraint

这里写图片描述

Solution

这道题一眼看过去,跟之前做的一道题很像,以为排个序做个背包就好,但发现O(n*w)会超时,就尴尬了…看一下数据,很明显是要O( n2 )Dp。
那要怎么Dp呢。我们先按Wi降序的排序,然后贪心的想,我们一定是从后往前取的。设F[i][j]表示前i个物品,从后往前取了j个的最大价值。那么第i个物品的真正价值就是Vi-Wi*(j-1),即减去对在它后面取的物品(排序在它前面的物品)的影响。
总式为 F[i][j]=Max{ F[i−1][j] , F[i−1][j−1]+v[i]−w[i]∗(j−1) }

Code

Uses Math;

Var
    n,Ans:Longint;
    a:Array[0..5005] OF Record
                            v,w:Longint;
                        End;
    f:Array[0..5005,0..5005] OF Longint;

Procedure Init();
Var
    i:Longint;
Begin
    Readln(n);
    For i:=1 To n Do Readln(a[i].v,a[i].w);
End;

Procedure Qsort(i,j:Longint);
Var
    l,r,m:Longint;
Begin
    If i>=j Then Exit;
    l:=i; r:=j; m:=a[(l+r) >> 1].w;
    Repeat
        While a[l].w>m Do Inc(l);
        While a[r].w<m Do Dec(r);
        If l<=r Then
        Begin
            a[0]:=a[l]; a[l]:=a[r]; a[r]:=a[0];
            Inc(l); Dec(r);
        End;
    Until l>r;
    Qsort(l,j); Qsort(i,r);
End;

Procedure Work();
Var
    i,j:Longint;
Begin
    Qsort(1,n);
    For i:=1 To n Do
        For j:=1 To i Do
        Begin
            f[i][j]:=Max(f[i-1][j],f[i-1][j-1]+a[i].v-a[i].w*(j-1));
            Ans:=Max(Ans,f[i][j]);
        End;
End;

Begin
    //Assign(Input,'value.in'); Reset(Input);
    //Assign(Output,'value.out'); Rewrite(Output);

    Init();
    Work();
    Writeln(Ans);

    //Close(Input); Close(Output);
End.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值