Description
Input
Output
Sample Input
5
8 2
10 7
5 1
11 8
13 3
Sample Output
27
The Solution
总物品的代价可以理解成在选择物品本来的价值之和减去代价。
于是倒数第i个物品可以产生wi*(i-1)的代价。那么我们可以考虑贪心和dp了。
首先,将所有物品按代价降序排序(从大到小)。则最优解一定是倒序选择一些物品。
我们设F[i][j]表示前i个物品中,选择了最后j个的最优解。
转移方程很显然。。。
F[i][j]=max(F[i−1][j],F[i−1][j−1]+w[i]∗(j−1))
CODE
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define fd(i,a,b) for (int i=a;i>=b;i--)
#define N 5005
using namespace std;
int n,F[N][N],ans=0;
struct Record
{
int v,w;
}a[N];
bool cmp(Record x,Record y)
{
return x.w>y.w;
}
int main()
{
//freopen("value.in","r",stdin);
//freopen("value.out","w",stdout);
scanf("%d",&n);
fo(i,1,n) scanf("%d%d",&a[i].v,&a[i].w);
sort(a+1,a+1+n,cmp);
fo(j,1,n)
{
int k=0;
fo(i,1,n)
{
F[i][j]=k+a[i].v-a[i].w*(j-1);
k=max(k,F[i][j-1]);
ans=max(ans,F[i][j]);
}
}
printf("%d",ans);
}