hdu 2184 01背包变形
转自:http://blog.csdn.net/liuqiyao_01/article/details/8753686
题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和funness值的和最大,而这些牛有些smartness或funness的值是负的,还要求最终的smartness之和以及funness之和不能为负。
这道题的关键有两点:一是将smartness看作花费、将funness看作价值,从而转化为01背包;二是对负值的处理,引入一个shift来表
示“0”,这里的shift一定要大于每一个smartness的绝对值,另外在遍历cost[]的时候如果cost[i]>0,显然时从开的数组
的最大值maxm
开始往下减,如果cost[i]<0,则是从0(是0,不是shift)开始往上增加。大于0的情况容易想到,小于0的情况比较费解,需要仔细思
考。
考虑只有一只牛,它的smartness为-x(x>0),funness为y(y>0),由于将dp[shift]赋初值为0,其它的dp[]赋初值为负无穷,所以有dp[shift-(-x)]+y>dp[shift],即dp[x]会被赋为dp[shift-(-x)]+y即y(
dp[x]=max(dp[shift-(-x)]+y,dp[shift]) ),由于x小于shift,所以在最后遍历最大值的时候,这个值根本不会被遍历。
再考虑前面已经有一些牛,此时dp[shift+x]=y(x>0,y>0)现在出现了一只为-a
b(a>0,b>0)的牛,那么dp[shift+X-a]会被赋为dp[shift+x-a-
(-a)]+b=dp[shift+x]+b=y+b;最终遍历的时候,如果取最后一只牛,和为x-a+y+b,如果不取,和为x+y,所以最大值究竟是
谁取决于b-a的正负。
综上所述,这是一种满足题目要求的方法,所以在cost[i]<0的时候时从0开始往上增加。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define inf (0x3f3f3f3f)
#define max(a,b) ((a)>(b)?(a):(b))
const int maxn=;
const int maxm=;
const int shift=;
int dp[maxm];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int a[maxn],b[maxn];
int va=,vb=;
int i,j;
for(i=;i<n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
memset(dp,-inf,sizeof(dp));
dp[shift]=;
for(i=;i<n;i++)
{
if(a[i]>)
for(j=maxm-;j>=a[i];j--)
dp[j]=max(dp[j-a[i]]+b[i],dp[j]);
else
for(j=;j<maxm+a[i];j++)
dp[j]=max(dp[j-a[i]]+b[i],dp[j]);
}
int ans=;
for(i=shift;i<maxm;i++)
if(dp[i]>&&(i-shift+dp[i]>ans))
ans=i-shift+dp[i];
printf("%d\n",ans);
}
return ;
}
hdu 2184 01背包变形的更多相关文章
- poj 2184 01背包变形【背包dp】
POJ 2184 Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14657 Accepte ...
- HDU 3466 01背包变形
给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...
- HDU 1203 01背包变形题,(新思路)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1203 I NEED A OFFER! Time Limit: 2000/1000 MS (Java/ ...
- hdu 3466 01背包变形【背包dp】
http://acm.hdu.edu.cn/showproblem.php?pid=3466 有两个物品P,Q,V分别为 3 5 6, 5 10 5,如果先dp第一个再dp第二个,背包容量至少要为3+ ...
- HDU 6092 01背包变形
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 【01背包变形】Robberies HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...
- FZU 2214 Knapsack problem 01背包变形
题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大, ...
- codeforce Gym 101102A Coins (01背包变形)
01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...
随机推荐
- Struts2拦截器的应用
拦截器类 public class AdminInterceptor extends AbstractInterceptor { private static final long serialVer ...
- asp.net缓存(转)
转自:http://www.cnblogs.com/knowledgesea/archive/2012/06/20/2536603.html 一.缓存概念,缓存的好处.类型. 缓 ...
- 【原创】angularjs1.3.0源码解析之scope
Angular作用域 前言 之前我们探讨过Angular的执行流程,在一切准备工作就绪后(我是指所有directive和service都装载完毕),接下来其实就是编译dom(从指定的根节点开始遍历do ...
- The Bottom of a Graph(tarjan + 缩点)
The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9139 Accepted: ...
- 支持高并发的IIS Web服务器常用设置 II
适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows ...
- 一个1年前的T-SQL问题
还记得年前的一个SQL问题,当时对SQL刚接触,因此绕开了它.用了别的办法.昨天看SQL突然想起了这个问题.百思不得其解,然后去SQL Server技术交流群,也请教了,大神高文佳,何志勇提示我因为先 ...
- Unity3d 去掉exe版本的边框
原地址:http://blog.sina.com.cn/s/blog_697b1b8c0101gd4h.html using System; using System.Runtime.InteropS ...
- Nmap备忘单:从探索到漏洞利用(Part 5)
这是备忘单的最后一部分,在这里主要讲述漏洞评估和渗透测试. 数据库审计 列出数据库名称 nmap -sV --script=mysql-databases 192.168.195.130 上图并没有显 ...
- 影像工作站的数据库安装错误之Win7系统下pg服务无法启动
1.关闭批处理 2.修改 PG安装路径下的Data文件下的pg_hba.conf文件中去掉IPv6的井号,如下图 3.结束pg进程 4.重启PG服务.
- 用php实现百度网盘图片直链的代码分享
第一种代码:代码量较少通过正则表达式获取百度网盘的文件真实地址,来实现直链的效果 将下面的代码保存为downbd.php 复制代码代码如下: <?php $canshu=$_SERVER[&qu ...