zoj 3596Course Selection System(dp,01背包)

题目描述

给你 n(500)(0Hi()10000,0Ci100) ,让你选出m个数最大化这个东西,

分析

x=mi=0Hxi,y=mi=0Cxi,(xy)22y2 ,很显然我们的目标是让 yxyx ,这不就是01背包吗?

AC code

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define pb push_back
#define mp make_pair
#define PI acos(-1)
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define INF64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int MOD = 1e9+7;
const int MAX_P = 2e4+10;
const int maxn = 50000+10;
const int MAX_V = 5e5+10;
typedef long long LL;
typedef long double DB;
typedef pair<int,int> Pair;

LL dp[maxn];

Pair a[maxn];

int main() {
    int T;
    scanf("%d",&T );
    while (T--) {
        int n;
        scanf("%d",&n );
        int maxv = 0;
        for(int i=0 ; iscanf("%d%d",&a[i].fi,&a[i].se);
            maxv += a[i].se;
        }
        memset(dp,0,sizeof(dp));
        for(int i=0 ; ifor(int j = maxv ; j-a[i].se >=0 ;--j){
                dp[j] = max(dp[j],dp[j-a[i].se]+a[i].fi);
            }
        }
        LL ans=0;
        for(int i=0 ; i<=maxv ; ++i){
            ans = max(ans,dp[i]*dp[i]-(dp[i]+i)*i);
        }
        std::cout << ans << '\n';
    }

    return 0;
}

你可能感兴趣的:(算法&数据结构)