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

来源:互联网 发布:jquery数组push 编辑:程序博客网 时间:2024/06/05 10:26

题目描述

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

分析

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

AC code

#include <cstdio>#include <iostream>#include <vector>#include <queue>#include <algorithm>#include <cmath>#include <cstring>#include <map>#include <set>#include <iomanip>#include <bitset>#define pb push_back#define mp make_pair#define PI acos(-1)#define fi first#define se second#define INF 0x3f3f3f3f#define INF64 0x3f3f3f3f3f3f3f3fusing 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 ; i<n ; ++i){            scanf("%d%d",&a[i].fi,&a[i].se);            maxv += a[i].se;        }        memset(dp,0,sizeof(dp));        for(int i=0 ; i<n ; ++i){            for(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;}
0 0
原创粉丝点击