poj 2184 Cow Exhibition(dp之01背包变形)
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 ( <= N <= ) cows a thorough interview and determined two values for each cow: the smartness Si (- <= Si <= ) of the cow and the funness Fi (- <= Fi <= ) 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 : A single integer N, the number of cows * Lines ..N+: Two space-separated integers Si and Fi, respectively the smartness and funness for each cow.
Output
* Line : 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 .
Sample Input
-
-
- - -
Sample Output
Hint
OUTPUT DETAILS: Bessie chooses cows , , and , giving values of TS = -++ = and TF
= -+ = , so + = . Note that adding cow would improve the value
of TS+TF to , but the new value of TF would be negative, so it is not
allowed.
Source
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
using namespace std;
#define inf 1<<30
#define N 106
int dp[];
int a[N],b[N];
int main()
{
int n;
while(scanf("%d",&n)==){
for(int i=;i<n;i++){
scanf("%d%d",&a[i],&b[i]);
}
//memset(dp,inf,sizeof(dp));
for(int i=;i<;i++){
dp[i]=-inf;
}
dp[]=;
for(int i=;i<n;i++){
//if(a[i]<0 && b[i]<0) continue;
if(a[i]>){
for(int j=;j>=a[i];j--){
dp[j]=max(dp[j],dp[j-a[i]]+b[i]);
}
}
else{
for(int j=a[i];j<=+a[i];j++){
dp[j]=max(dp[j],dp[j-a[i]]+b[i]);
}
}
}
int ans=;
for(int i=;i<=;i++){
if(dp[i]>=){
ans=max(ans,dp[i]+i-);
}
}
printf("%d\n",ans);
}
return ;
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; int dp[];
const int inf = <<; int main()
{
int n,s[],f[],i,j,ans;
while(~scanf("%d",&n))
{
for(i = ; i<=; i++)
dp[i] = -inf;
dp[] = ;
for(i = ; i<=n; i++)
scanf("%d%d",&s[i],&f[i]);
for(i = ; i<=n; i++)
{
if(s[i]< && f[i]<)
continue;
if(s[i]>)
{
for(j = ; j>=s[i]; j--)//如果s[i]为整数,那么我们就从大的往小的方向进行背包
if(dp[j-s[i]]>-inf)
dp[j] = max(dp[j],dp[j-s[i]]+f[i]);
}
else
{
for(j = s[i]; j<=+s[i]; j++)//为负数则需要反过来
if(dp[j-s[i]]>-inf)
dp[j] = max(dp[j],dp[j-s[i]]+f[i]);
}
}
ans = -inf;
for(i = ; i<=; i++)//因为区间100000~200000才是表示的整数,那么此时的i就是之前背包中的s[i],如果此时dp[i]也就是f[i]大于等于0的话,我们再加上s[i](此时为i),然后减去作为界限的100000,就可以得到答案
{
if(dp[i]>=)
ans = max(ans,dp[i]+i-);
}
printf("%d\n",ans);
} return ;
}
poj 2184 Cow Exhibition(dp之01背包变形)的更多相关文章
- POJ 2184 Cow Exhibition【01背包+负数(经典)】
POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的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背包)
Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10882 Accepted: 4309 D ...
- POJ 2184 Cow Exhibition (01背包的变形)
本文转载,出处:http://www.cnblogs.com/Findxiaoxun/articles/3398075.html 很巧妙的01背包升级.看完题目以后很明显有背包的感觉,然后就往背包上靠 ...
- POJ 2184 Cow Exhibition 01背包
题意就是给出n对数 每对xi, yi 的值范围是-1000到1000 然后让你从中取若干对 使得sum(x[k]+y[k]) 最大并且非负 且 sum(x[k]) >= 0 sum(y[k] ...
- POJ 2184 Cow Exhibition (带负值的01背包)
题意:给你N(N<=100)只牛,每只牛有一个智慧值Si和一个活泼值Fi,现在要从中找出一些来,使得这些牛智慧值总和S与活泼值总和F之和最大,且F和S均为正.Si和Fi范围在-1000到1000 ...
- poj 2184 Cow Exhibition(背包变形)
这道题目和抢银行那个题目有点儿像,同样涉及到包和物品的转换. 我们将奶牛的两种属性中的一种当作价值,另一种当作花费.把总的价值当作包.然后对于每一头奶牛进行一次01背包的筛选操作就行了. 需要特别注意 ...
- POJ - 2184 Cow Exhibition 题解
题目大意 有 \(N(N \le 100)\) 头奶牛,没有头奶牛有两个属性 \(s_i\) 和 \(f_i\),两个范围均为 \([-1000, 1000]\). 从中挑选若干头牛,\(TS = \ ...
随机推荐
- (转)Apple Push Notification Services in iOS 6 Tutorial: Part 1/2
转自:http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1 Upda ...
- android中定位光标位置
edittext.setSelection(int); edittext.setText(123);//设置edittext中的内容 edittext.setSelection(123.length( ...
- 一些使用Android设备调试功能的注意事项(挖职位)
华为3C Activity切换动画过热. 当显示器是不是大图easy显现OOM(应用最大大于其他手机内容).因此,调试OOM不要当问题用这个手机,否则,很难发现问题. 小米3 不要调用系统的裁图功能. ...
- HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)
/** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...
- hdu 1076
水题 AC代码: #include <iostream> using namespace std; int main() { int i,k,t,y,n; cin>>t; wh ...
- DG下手工处理v$archive_gap方法
从9i以后,oracle dataguard 备库一般都不需要手工处理丢失的日志,FAL自动会帮我们处理,下面通过个案例来讲下手工处理丢失的日志的方法: 1.在备库查询有哪些日志丢失,没应用到备库 S ...
- C#类的基本用法
Preson类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- C#ArrayList对象集合
ArrayList alist = new ArrayList(); //集合对像 长度可以改变,类型不限 //添加单个元素可以Add() alist.Add("在在的"); al ...
- window对象BOM
BOM的和新对象是window,他表示流浪器的一个实例,作为一个Global对象,有权访问parseInt()等方法 在全局作用域声明的变量,函数都有钱访问 ; function sayName () ...
- Selinux 禁用
Selinux是对于强制访问控制的实现,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件. 对于新手来说会影响我们的操作.一般情况下是不需要的,所以禁用他,如果需要的情况下,我们可以 ...