SOJ 2142 Cow Exhibition

来源:互联网 发布:js时间转化成数字串 编辑:程序博客网 时间:2024/05/28 06:07

题意:有N头牛(0<N100),每头牛有两个属性smartness(Si)和funness(Fi),现在需要从这N头牛中选出一部分牛,使得这些牛的smartness之和和funness之和最大,并且他们的smartness之和 以及 funness之和不能为负值. 输出最大的 smartness之和 + funness之和.
分析:设每头牛的Ai = Si + Fi, 如果把所有大于0的Ai加起来,貌似就能得到最大值,但是这样不能保证Si之和以及Fi之和也为整数,所以不能这样做.
这里有个很巧妙的做法,把牛的两个属性Si和Fi,一个当成物品容量,一个当成物品价值,这样就可以对于每一个固定的S值算出最大的F,然后最后在所有的S>=0, F>=0的值中找到一个最大的S+F.着实是01背包及其巧妙的转化.这里需要注意一个问题是容量为负值时需要从前往后更新.
代码:

#include <bits/stdc++.h>using namespace std;const int maxn = 100 + 5;;const int maxv = 100000 + 5;const int inf = 0x3f3f3f3f;int S[maxn], F[maxn];int N;int dp[maxv*2];int main(){    while(scanf("%d", &N) == 1) {        int m1 = 0, m2 = 0;        for(int i = 0; i < N; i++) {            scanf("%d%d", &S[i], &F[i]);            if(S[i] > 0) {                m1 += S[i];            } else {                m2 += S[i];            }        }        int max_sum = max(m1, abs(m2)) + 10;        for(int i = 0; i < 2*max_sum; i++) dp[i] = -inf;        dp[max_sum] = 0;        int ans = 0;        for(int i = 0; i < N; i++) {            int v = S[i];            if(v >= 0) {                for(int j = 2*max_sum - 1; j >= v; j--) {                    dp[j] = max(dp[j], dp[j-v] + F[i]);                    if(j >= max_sum && dp[j] >= 0) {                        ans = max(ans, j - max_sum + dp[j]);                    }                }            } else {                for(int j = 0; j <= 2*max_sum + v - 1; j++) {                    dp[j] = max(dp[j], dp[j-v] + F[i]);                    if(j >= max_sum && dp[j] >= 0) {                        ans = max(ans, j - max_sum + dp[j]);                    }                }            }        }        printf("%d\n", ans);    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 子宫长了个囊肿怎么办 怀孕后不想要该怎么办 20多岁雌激素低怎么办 生完小孩后子宫下垂怎么办 取环之前同房了怎么办 做人流后又怀孕怎么办 仓鼠长了个肿瘤怎么办 过敏留下的黑印怎么办 脸上痘痘发炎了怎么办 脸上皮肤红痒怎么办啊 皮肤有一片红痒怎么办 脸过敏期间很干怎么办 怀孕了用了消糜栓怎么办 乳酸杆菌少或无怎么办 怀孕了白带有异味怎么办 怀孕清洁度iv度怎么办 怀孕了下面有异味怎么办 孕妇尿白细胞1是怎么办 药流期间喂奶了怎么办 20多岁卵巢早衰怎么办 3岁儿童肚子胀气怎么办 肚子又胀又痛怎么办 1岁宝宝肚子胀气怎么办 2岁宝宝肚子胀气怎么办 产后腰粗肚子大怎么办 发烧后腹泻拉水怎么办 又吐又拉还发烧怎么办 喝中药恶心想吐怎么办 生完孩子肛门疼怎么办 拉完大便肛门痛怎么办 肚子总是凉凉的怎么办 京东金条风控了怎么办 京东维修没发票怎么办 假牙吞到肚子里怎么办 眼睛一只大一只小怎么办 一个眼睛大一个眼睛小怎么办 电脑上的字模糊怎么办 无忧乐行注销了怎么办 连供墨盒有空气怎么办 30岁突然停经了怎么办 下面很痒怎么办白带多