POJ 2184 Cow Exhibition 01背包
题意就是给出n对数
每对xi, yi 的值范围是-1000到1000
然后让你从中取若干对
使得sum(x[k]+y[k]) 最大并且非负 且 sum(x[k]) >= 0 sum(y[k]) >= 0 其中 k为所有你取到的标号
然后刚开始没什么思路
后来想想。 这就是背包吧。
将x看成花费,y看成价值
然后dp[i]表示在花费了i情况时价值最大是多少
注意到数值有负数
所以要加一些技巧
所有x的总值可能是-10w,而所有y的总值也可能是-10W
那么可以dp[100000] = 100000
以这个作为什么都没取的状态。
然后我们要判断第一个数的和是否非负就是判断 dp[i]中的i是否小于10W
然后判断第二个数的和非负就是判断dp[i]是否小于10W
这样的好处是我们只需要在转移方程时,
如果花费为c,价值为w
判断dp[i - c] 是否为0即可判断其状态是否合法
这是因为我们要的是恰好总和为i的状态。
所以起始的合法状态只有1个
然后在转移的时候也需要注意
开一个数组就行了。
传统的01背包转移, 使用滚动数组的方法是倒着来
那么对于这题有正花费有负花费。
所以对于负花费很显然是正着来的。
而且这题直接枚举1到20W这样花费 就比较慢。
因为有很多状态的花费还没有用到。
所以每次计算一下可能用到的间隔。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>
#include <vector>
#define MAXN 200005
#define INF 1000000007
using namespace std;
int dp[MAXN];
int mid = 100002;
int n;
int main()
{
dp[mid] = mid;
int c, w;
scanf("%d", &n);
int l = mid, r = mid;
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &c, &w);
l = min(l, l + c);
r = max(r, r + c);
if(c > 0)
{
for(int j = r; j >= l; j--)
if(dp[j - c])
dp[j] = max(dp[j - c] + w, dp[j]);
}
else
{
for(int j = l; j <= r; j++)
if(dp[j - c])
dp[j] = max(dp[j - c] + w, dp[j]);
}
}
int res = 0;
for(int i = mid; i < MAXN; i++)
if(dp[i] >= mid)
res = max(res, i - mid + dp[i] - mid);
printf("%d\n", res);
return 0;
}
POJ 2184 Cow Exhibition 01背包的更多相关文章
- [POJ 2184]--Cow Exhibition(0-1背包变形)
题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total S ...
- POJ 2184 Cow Exhibition (01背包变形)(或者搜索)
Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10342 Accepted: 4048 D ...
- POJ 2184 Cow Exhibition (01背包的变形)
本文转载,出处:http://www.cnblogs.com/Findxiaoxun/articles/3398075.html 很巧妙的01背包升级.看完题目以后很明显有背包的感觉,然后就往背包上靠 ...
- poj 2184 Cow Exhibition(背包变形)
这道题目和抢银行那个题目有点儿像,同样涉及到包和物品的转换. 我们将奶牛的两种属性中的一种当作价值,另一种当作花费.把总的价值当作包.然后对于每一头奶牛进行一次01背包的筛选操作就行了. 需要特别注意 ...
- PKU 2184 Cow Exhibition 01背包
题意: 有一些牛,每头牛有一个Si值,一个Fi值,选出一些牛,使得max( sum(Si+Fi) ) 并且 sum(Si)>=0, sum(Fi)>=0 思路: 随便选一维做容量(比如Fi ...
- POJ 2184 Cow Exhibition(背包)
希望Total Smart和Totol Funess都尽量大,两者之间的关系是鱼和熊掌.这种矛盾和背包的容量和价值相似. dp[第i只牛][j = 当前TotS] = 最大的TotF. dp[i][j ...
- POJ 2184 Cow Exhibition【01背包+负数(经典)】
POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的01背包,可以把幽 ...
- poj 2184 Cow Exhibition(dp之01背包变形)
Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - ...
- poj 2184 Cow Exhibition(01背包)
Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10882 Accepted: 4309 D ...
随机推荐
- c# 阶段总结
然并卵然并卵然并卵然并卵然并卵然并卵然并卵
- selenium中用js定位html上没有id,没有name的元素
所测试的页面包含display:none的元素,所以考虑用js,在使用js的过程中,js要获得页面的对象,没有id,没有name ...... <a class="employer&q ...
- 10-IOSCore - 应用间通信、本地通知
一.应用间通信 URL 调用系统服务: tel:11111 sms:xxx@163.com http:// URL深入 类型://主机:端口/地址?参数 label框等于文字大小快捷键:command ...
- gethostbyname()函数说明
gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件 #include <netdb.h> #include <sys/socket.h> ...
- 【C++】第二章:Hello World!
1.开发工具:Microsoft Visual C++ v6.0 2.通过IDE建立Hello World程序: 我们可以看到三个文件夹结构,分别是: Source Files(源文件). Heade ...
- 设计模式(五)适配器模式Adapter(结构型)
设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...
- Python多线程下的_strptime问题
Python多线程下的_strptime问题 由于Python的datetime和time中的_strptime方法不支持多线程,运行时会报错: import datetimeimport threa ...
- C++里面的取整函数
#include<math.h> double ceil(double x) //向上取整 double floor(double x) //向下取整 也能够用数据类型强制转换,那要看数据 ...
- [置顶] Guava学习之Iterators
Iterators类提供了返回Iterator类型的对象或者对Iterator类型对象操作的方法.除了特别的说明,Iterators类中所有的方法都在Iterables类中有相应的基于Iterable ...
- France '98
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30506#problem/H #include<map> #include&l ...