jzoj 4710. 【NOIP2016提高A组模拟8.17】Value 贪心+动态规划

来源:互联网 发布:蔡仕伟淘宝 编辑:程序博客网 时间:2024/05/18 01:27

题意:给出n(n<=5000)件物品,每件物品有一个价值v[i]和一个代价w[i],若选了第i件物品则其余物品的价值都要减去w[i]。现在可以以任意顺序选择任意数量的物品,求最大的总价值。


分析:我们贪心地去想,若现在我们确定了要选的s件物品,那么我们肯定是按w[i]从小到大来进行选择。那么我们就可以把每件物品按w[i]从大到小进行排序,设f[i,j]为前i件物品中选了j件的最大价值是多少

f[i,j]=max(f[i-1,j],f[i-1,j-1]+v[i]-w[i]*(j-1))


代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define N 5100#define inf 1e+7using namespace std;int n,f[N];struct data{int v,w;}a[N];bool cmp(data a,data b){return a.w>b.w;}int main(){scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d%d",&a[i].v,&a[i].w);sort(a+1,a+n+1,cmp);int ans=0;for (int i=1;i<=n;i++)for (int j=i;j>=1;j--){f[j]=max(f[j],f[j-1]+a[i].v-a[i].w*(j-1));ans=max(ans,f[j]);}printf("%d",ans);return 0;}


0 1
原创粉丝点击