ZOJ3956

来源:互联网 发布:标题优化的好处 编辑:程序博客网 时间:2024/06/06 13:22

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 longconst 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 , 1LONG  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
原创粉丝点击