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开始往上增加。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define inf (0x3f3f3f3f) 6 #define max(a,b) ((a)>(b)?(a):(b)) 7 const int maxn=105; 8 const int maxm=210000; 9 const int shift=10000; 10 int dp[maxm]; 11 int main() 12 { 13 int n; 14 while(scanf("%d",&n)!=EOF) 15 { 16 int a[maxn],b[maxn]; 17 int va=0,vb=0; 18 int i,j; 19 for(i=0;i<n;i++) 20 { 21 scanf("%d%d",&a[i],&b[i]); 22 } 23 memset(dp,-inf,sizeof(dp)); 24 dp[shift]=0; 25 for(i=0;i<n;i++) 26 { 27 if(a[i]>0) 28 for(j=maxm-1;j>=a[i];j--) 29 dp[j]=max(dp[j-a[i]]+b[i],dp[j]); 30 else 31 for(j=0;j<maxm+a[i];j++) 32 dp[j]=max(dp[j-a[i]]+b[i],dp[j]); 33 } 34 int ans=0; 35 for(i=shift;i<maxm;i++) 36 if(dp[i]>0&&(i-shift+dp[i]>ans)) 37 ans=i-shift+dp[i]; 38 printf("%d\n",ans); 39 } 40 return 0; 41 }
转载于:https://www.cnblogs.com/cnblogs321114287/p/4349176.html
hdu 2184 01背包变形相关推荐
- HDU 3466 01背包变形
给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...
- codeforce Gym 101102A Coins (01背包变形)
01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...
- P1734 最大约数和 01背包变形
传送门 思路:01背包变形题.将i看成重量,i的因子看成价值即可.背包自然是s. /** * From: * Qingdao Agricultural University * Created by ...
- HDU 2546 饭卡 01背包变形
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- hdu 3732(01背包转多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...
- hdu 2955 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...
- 2022-9-2何以包邮(01背包变形)(c/c++实测满分)
总结: 此题是背包问题的变形,物品的价值和重量有所改变,背包的容量限制有所改变,但核心动态规划求法没有改变.只需要在背包问题的解法上根据题意对物品表示,答案输出进行改变即可. 背包算法 ...
- poj 2063 Investment(01背包变形)
http://poj.org/gotoproblem?pid=2063 (1)上限 m 一直上升的 n 次01背包问题,比一般的01背包多了一重循环: (2)本题出现了各种错误:1)刚开始,没注意 m ...
- hdu 1574(01背包)
RP问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Des ...
最新文章
- NSUserDefaults的用法
- 解决bootstrap-table多次请求只触发一次的问题
- g++配置选项-std=c++11
- 亿能 性能测试课程 2013年度 公开课 深圳站
- 「Tensorflow」错误tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
- 如何搭建一个“不可告人的”私人专属网盘?教程拿去
- css hack(ie6-9,firefox,chrome,opera,safari)
- Debian下IPv6设定主地址 Set primary IPv6 address under Debian Linux
- Java比以往任何时候都摇滚
- Django讲课笔记06:搭建项目开发环境
- Log4net使用详细说明
- [转载] [硕.Love Python] QuickSort(快速排序)
- mac环境下安装mysql
- 国内优秀论坛之大汇集
- 适合计算机课堂玩的游戏,几个课堂小游戏(能活跃课堂气氛)
- iOS常用第三方库大全
- JavaScript实现的躲避球小游戏
- fluent当中的梯度宏和VOF梯度的获取【转载】
- 机加工行业如何打造MES系统,本文让你一目了然
- LBR_iiwa_14_R820代码解析
热门文章
- MySQL Operators(比较操作符,逻辑运算符)
- 1.6 语言模型和序列生成
- 我的域控是不是被攻击了?吓!
- vSphere虚拟化使用第三方备份方案常见CBT故障实战处理
- Docker学习总结(20)——Docker 容器实践精华问答集锦
- Git学习总结(12)——多人开发 Git 分支管理详解
- idea上一步下一步快捷键_【MySQL】一步一步的教你在windows下安装MySQL5.7
- python调用hive与java调用区别_python3.6.5基于kerberos认证的hive和hdfs连接调用方式
- VS调试 启动vs报错--未启动IIS
- 转载 : JSP取得绝对路径