ZOJ-3956 Course Selection System(01背包)

来源:互联网 发布:怎么开淘宝店铺 流程 编辑:程序博客网 时间:2024/06/05 15:28

题意:让你选定m,求公式所得的最大结果。

思路:我们选的m的前提肯定是尽量使得减数大、被减数小。那么我们可以枚举∑Ci,求得最大Hi。那么这个就转化的和01背包问题差不多了。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int MOD = 1e9+7;const int N = 1005;int h[N],c[N];long long dp[50005];int main(){    int t,n;    cin>>t;    while(t--)    {        memset(dp,0,sizeof(dp));        scanf("%d",&n);        for(int i = 1;i <= n;i++)            scanf("%d%d",&h[i],&c[i]);        int sum = 0;        for(int i = 1;i <= n;i++)            sum += 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 long maxn = 0;        for(int i = 1;i <= sum;i++)            maxn = max(maxn,dp[i]*dp[i]-dp[i]*i-i*i);        printf("%lld\n",maxn);    }    return 0;}


0 0
原创粉丝点击