Description
Input
第一行n
接下来n行v[i],w[i]
Output
答案
Sample Input
5
8 2
10 7
5 1
11 8
13 3
Sample Output
27
Data Constraint
N<=5000,w[i],v[i]<=100000
Solution
一看到题面,以为又是一道简单的背包问题,然后发现100000*5000就爆时间了
首先按照代价从小到大排序是显然的,然后我就打背包了,结果TLE,但是某些会卡的人就卡过去了,这卡的太厉害了
既然N比较小,那就从N入手,先按照代价从大到小排序,那么显然第j个物体对答案的贡献为w[i]*(j-1),设f[i,j]表示在前i个中选了后j个的答案
那么
f[i,j]=max(f[i−1,j],f[i−1,j−1]+v[i]−w[i]∗(j−1))
然后又水过一题
Code
#include<cstdio>
#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 5010
using namespace std;
int n,f[N][N],mx;
struct node{
int v,w;
};
node a[N];
bool cnt(node x,node y){return x.w>y.w;}
int main()
{
scanf("%d",&n);
fo(i,1,n) scanf("%d%d",&a[i].v,&a[i].w),mx=max(mx,a[i].v);
sort(a+1,a+n+1,cnt);int ans=0,k=0;
fo(i,1,n)
{
fo(j,1,n)
{
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]);
}
}
printf("%d",ans);
}