POJ2184——背包DP——Cow Exhibition

Description

"Fat and docile, big and dumb, they look so stupid, they aren‘t much 
fun..." 
- Cows with Guns by Dana Lyons

The cows want to prove to the public that they are both smart and fun. In order to do this, Bessie has organized an exhibition that will be put on by the cows. She has given each of the N (1 <= N <= 100) cows a thorough interview and determined two values for each cow: the smartness Si (-1000 <= Si <= 1000) of the cow and the funness Fi (-1000 <= Fi <= 1000) of the cow.

Bessie must choose which cows she wants to bring to her exhibition. She believes that the total smartness TS of the group is the sum of the Si‘s and, likewise, the total funness TF of the group is the sum of the Fi‘s. Bessie wants to maximize the sum of TS and TF, but she also wants both of these values to be non-negative (since she must also show that the cows are well-rounded; a negative TS or TF would ruin this). Help Bessie maximize the sum of TS and TF without letting either of these values become negative.

Input

* Line 1: A single integer N, the number of cows

* Lines 2..N+1: Two space-separated integers Si and Fi, respectively the smartness and funness for each cow.

Output

* Line 1: One integer: the optimal sum of TS and TF such that both TS and TF are non-negative. If no subset of the cows has non-negative TS and non- negative TF, print 0.

Sample Input

5
-5 7
8 -6
6 -3
2 1
-8 -5

Sample Output

8

Hint

OUTPUT DETAILS:

Bessie chooses cows 1, 3, and 4, giving values of TS = -5+6+2 = 3 and TF 
= 7-3+1 = 5, so 3+5 = 8. Note that adding cow 2 would improve the value 
of TS+TF to 10, but the new value of TF would be negative, so it is not 
allowed.

大意:有两组数据,求将两组数据分别相加之后和的最大值(必须满足这两组数据的和都为正)

将a[i]看作是花费,b[i]看作是价值,因为存在负值,所以进行讨论,如果a[i]大于0就相当于普通的01背包,如果a[i]小于0,则是01背包的逆(填充空间却有价值,就是要算填充空间最少时价值的最大,而01背包是消耗空间最小时价值的最大)只要将for循环倒过来,01背包完全背包for的循环条件都是在(0...V),所以(a[i],a[i]+200000)(与完全背包区分,完全背包是(0..V)因为要下表不为负所以写成(a[i]...V)),所以每一个dp[i]为以a[i]为下标的最大的价值,最后只要遍历,找到dp[i]+i-100000就是(if(dp)和i从100000遍历保证不出现sum为负的情况)比较难想,负数处理只要给定中间值,背包大小100000 = 100*1000。

(why?01背包完全背包for条件必须在(0,V)区间里面)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
const int MAX = 100000+5;
int dp[2*MAX];
int a[105],b[105];
int main()
{
    int x,y;
    int T;
    while(~scanf("%d",&T)){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i = 1 ; i <= T; i++){
            scanf("%d%d",&a[i],&b[i]);
        }
        for(int i = 0; i <= 200000;i++)
            dp[i] = -inf;
        dp[100000] = 0;
        for(int i = 1; i <= T; i++){
            if(a[i] < 0 && b[i] < 0)
                continue;
            else if(a[i] > 0){
                for(int j = 200000; j >= a[i]; j--){
                     if(dp[j-a[i]] > - inf){
                  dp[j] = max(dp[j],dp[j-a[i]] + b[i]);
                     }
                }
            }
            else {
                for(int j = a[i]; j <= 200000+a[i]; j++){
                    if(dp[j-a[i]] > -inf){
                    dp[j] = max(dp[j],dp[j-a[i]]+b[i]);
                    }
                }
            }
        }
        int max1 = -inf;
        for(int i = 100000; i <= 200000; i++){
            if(dp[i] >= 0)
            max1 = max(max1,dp[i]+i-100000);
                }
                printf("%d\n",max1);
            }
        return 0;
}

时间: 2024-10-17 22:30:52

POJ2184——背包DP——Cow Exhibition的相关文章

poj2184 Cow Exhibition p-01背包的灵活运用

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://poj.org/problem?id=2184 Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to the public that they ar

POJ2184 Cow Exhibition 【01背包】

Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9383   Accepted: 3601 Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to t

poj 2184 Cow Exhibition(01背包)

Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10882   Accepted: 4309 Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to

poj 2184 - Cow Exhibition (01背包) 解题报告

Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10279   Accepted: 4016 Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to

Cow Exhibition 变种背包

Cow Exhibition Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want t

poj 2184 Cow Exhibition (变形的01背包)

链接:poj 2184 题意:给定n头牛,每头牛的的智商(si)和幽默感(fi)已知,求在保证智商(S)的和及幽默感(F)的和都为非负的情况下,智商和幽默感(S+T)的最大值 分析:题的本质即从n头牛中选出S>=0&&T>=0时,S+T的最大值 以智商最为容量,幽默感作为价值,因为每头牛只能选一次,就转化01背包了, dp[i]为智商为i时幽默感的最大值,则状态转移方程为 dp[j]=max(dp[j],dp[j-s[i]]+f[i]); 但是智商总和范围-100000~100

poj 2484 Cow Exhibition 【变形0-1背包】

题目:poj 2484 Cow Exhibition 题意:给出n头牛,每头牛有一个幸运值 si 和聪明值 ti ,现在要选出一些牛,让两个值的和最大,前提是sum(si)和sum(ti)都是非负值. 分析:此题数据量不大,可以暴搜+剪枝水过. 这里要说的是0-1背包的思想,这个题目明显的变形就是物品有两个属性值,而且都要选最大的. 那么我们可不可以把一个值固定下来来求另一个值的最大值,根据0-1背包的思想,定义状态:dp[i]表示装入一些物品使得sum(si)的时候最大的sum(ti)的值.

poj 2184 Cow Exhibition 01背包变形

点击打开链接链接 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9288   Accepted: 3551 Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to p

POJ 2184:Cow Exhibition(01背包变形)

题意:有n个奶牛,每个奶牛有一个smart值和一个fun值,可能为正也可能为负,要求选出n只奶牛使他们smart值的和s与fun值得和f都非负,且s+f值要求最大. 分析: 一道很好的背包DP题,我们将smart值当作物品的体积,将fun值当作物品的价值,每个物品只能取一次,我们求对于每个背包体积求恰好装满该体积时价值和的最大值,也就是当所选奶牛smart值为某个值时,fun值的和的最大值.然后对于每个非负背包体积(smart值的和),判断对应最大价值(fun值的和)是否非负,如果非负说明这是一