Description
Analysis
一开始dp想偏了,改了还是错的。。
好吧dp水平不够 认了。。。
首先,价值其实就是
∑vi−∑(i−1)∗wi
显然应该是先选代价小的更优。
尝试dp,设
f[i][j]
表示前
i
个数中选了
f[i][j]=max(f[i−1][j],f[i−1][j−1]+???)
哎呀, ??? 不知道写什么好了。。。时间爆炸了!!
等等,反过来枚举不就好了?!
Code
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=5010;
int n,f[N][N];
struct good
{
int v,w;
}a[N];
bool cmp(good a,good b){return a.w>b.w;}
int main()
{
scanf("%d",&n);
fo(i,1,n) scanf("%d %d",&a[i].v,&a[i].w);
sort(a+1,a+n+1,cmp);
int ans=0;
fo(i,1,n)
fo(j,1,i)
{
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);
return 0;
}