ZOJ3956

Course Selection System

题意是给出n对(Hi , Ci)
需要我们选出m对(m是我们自己选择的)使得
最大

看到C[i]的数据范围,大概感觉就是需要枚举的。我们观察一下这个式子,发现当∑Ci一定的时候Hi越大越好,这样的话我们可以直接把题目转化成一个01背包问题去求解。当∑C[i]一定时,如何获得最大的∑Hi

#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<time.h>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<iostream>
using namespace std;
#define  LONG long long
const int   INF=0x3f3f3f3f;
const LONG  MOD=1e9+ 7;
const double PI=acos(-1.0);
#define clrI(x) memset(x,-1,sizeof(x))
#define clr0(x) memset(x,0,sizeof x)
#define clr1(x) memset(x,INF,sizeof x)
#define clr2(x) memset(x,-INF,sizeof x)
#define EPS 1e-10
#define lson  l , mid , rt<< 1
#define rson  mid + 1 ,r , (rt<<1)+1
#define root 1, m , 1
LONG  H[600] ;
LONG C[600];
LONG dp[60000] ;
int main()
{
    int T ;
    cin>>T;
    while(T--)
    {
        clr0(dp) ;
        int n ;
         cin >>n ;
         int sum = 0 ;
         for( int i = 1; i<= n ;++ i)
         {
             scanf("%lld%lld",&H[i],&C[i]) ;
             sum += (int )C[i] ;
        }
         for( int i = 1; i <= n ;++ i)
             for(int j = sum ; j >= C[i] ; -- j)
             dp[j] = max(dp[j] , dp[j-C[i]] + H[i] ) ;
         LONG ans = 0 ;
         for(LONG  i = 0 ; i <= (LONG )sum ; ++ i )
            ans =max(ans , dp[i] * dp[i] - i * i - i * dp[i]) ;
        cout<<ans<<endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值