浙大校赛 ZOJ 3956Course Selection System (01背包)

来源:互联网 发布:道光知乎 编辑:程序博客网 时间:2024/06/06 05:32



题意:给定n件物品,每件物品有2个值H和C,求选取一些物品使$$(\sum_{i=1}^{m} H_{x_i})^2-(\sum_{i=1}^{m} H_{x_i})\times(\sum_{i=1}^{m} C_{x_i})-(\sum_{i=1}^{m} C_{x_i})^2$$的值最大

思路:C的范围比较小,求C的总和sum,然后作为背包容量,求出和为1~sum时H的和的最大值,最后求下要求式子的最大值。

 

比赛时一直想着贪心,按H-C从大到小拍下序,一直wa


code:

#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;const int maxn=510;typedef long long ll;ll h[maxn],c[maxn],dp[100*maxn];int main(){    int t,n;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);       ll  ans=0,sum=0;        for(int i=0; i<n; i++)        {            scanf("%lld%lld",&h[i],&c[i]);            sum+=c[i];        }        memset(dp,0,sizeof(dp));        for(int i=0; i<n; i++)        {            for(ll j=sum;j>=c[i];j--)            {                dp[j]=max(dp[j-c[i]]+h[i],dp[j]);            }        }        for(ll i=1;i<=sum;i++)        {            ans=max(ans,dp[i]*dp[i]-dp[i]*i-i*i);        }        printf("%lld\n",ans);    }}


0 0
原创粉丝点击