POJ-2184 Cow Exhibition---01背包变形(负数偏移)
题目链接:
https://vjudge.net/problem/POJ-2184
题目大意:
给出num(num<=100)头奶牛的S和F值(-1000<=S,F<=1000),要求在这几头奶牛中选出若干头,使得在其总S值TS和总F值TF均不为负的前提下,求最大的TS+TF值
思路:
可以把S当体积,F当价值做01背包。但是注意是S可为负,所以整体加100000,然后要注意DP顺序,S为负是要顺序,为正时逆序。
还有就是注意DP时的范围,凡是可能影响的都要包括。
1 //#include<bits/stdc++.h> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 const int maxn = 105; 6 const int maxm = 2e5+10; 7 const int INF = 0x3f3f3f3f; 8 int v[maxn], w[maxn]; 9 int dp[maxm]; 10 int T, n; 11 double m; 12 int main() 13 { 14 int k = 100000;//整体偏移k位,dp[k]就是标准的dp[0] 15 while(cin >> n) 16 { 17 memset(dp, -INF, sizeof(dp)); 18 dp[k] = 0;//注意初始化 19 int x, y; 20 for(int i = 0; i < n; i++) 21 { 22 cin >> x >> y; 23 24 //这里不能写if(x+y<0)continue;这是错误的贪心,一开始因为这个地方一直WA,因为有些x+y<0加入是由于x>0 y<0,x的加入使得x和其他的最优解非负 25 if(x <= 0 && y <= 0)continue;//可以直接由贪心排除 26 27 if(x < 0)//x小于0,dp转移方向从前往后,因为每一步dp[i]需要dp[i-x]更新,由于是负数i-x>i 28 { 29 for(int i = 0; i <= 2 * k + x; i++) 30 if(dp[i - x] > -INF)//这里不能省略,如果dp[i - x]为-INF,那么就不可以更新前面的值 31 dp[i] = max(dp[i], dp[i - x] + y); 32 } 33 34 else //x大于0,dp转移方向从后往前,就是01背包 35 { 36 for(int i = 2 * k; i >= x; i--) 37 if(dp[i - x] > -INF) 38 dp[i] = max(dp[i], dp[i - x] + y); 39 } 40 } 41 int ans = 0; 42 for(int i = k; i <= 2 * k; i++)//从k开始,结果减去k 43 if(dp[i] >= 0)//此处必须大于0,因为dp[i]为TF的值,题目要求TF非负 44 ans = max(ans, dp[i] + i - k); 45 cout<<ans<<endl; 46 } 47 return 0; 48 }
转载于:https://www.cnblogs.com/fzl194/p/8784550.html
POJ-2184 Cow Exhibition---01背包变形(负数偏移)相关推荐
- poj 2063 Investment(01背包变形)
http://poj.org/gotoproblem?pid=2063 (1)上限 m 一直上升的 n 次01背包问题,比一般的01背包多了一重循环: (2)本题出现了各种错误:1)刚开始,没注意 m ...
- POJ 2184 Cow Exhibition
01背包.把一个属性当成费用,另一个属性当成价值.费用可能为负数,处理的时候加上100000就可以了. #include<cstdio> #include<cstring> # ...
- poj 1252 Euro Efficiency (01背包变形)
http://poj.org/gotoproblem?pid=1252 (1)不是单纯的01背包问题,硬币有去有回(即有正有负),这使得用想买你的解法,上限难以确定,所以我开了dp[10000]的数组 ...
- 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 2184 01背包变形
转自:http://blog.csdn.net/liuqiyao_01/article/details/8753686 题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和fu ...
- POJ 3624 Charm Bracelet 0-1背包
传送门:http://poj.org/problem?id=3624 题目大意:XXX去珠宝店,她需要N件首饰,能带的首饰总重量不超过M,要求不超过M的情况下,使首饰的魔力值(D)最大. 0-1背包入 ...
- HDU 2546 饭卡 01背包变形
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 2022-9-2何以包邮(01背包变形)(c/c++实测满分)
总结: 此题是背包问题的变形,物品的价值和重量有所改变,背包的容量限制有所改变,但核心动态规划求法没有改变.只需要在背包问题的解法上根据题意对物品表示,答案输出进行改变即可. 背包算法 ...
- HDU 3466 01背包变形
给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...
最新文章
- java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
- Android实现Banner界面广告图片循环轮播(包括实现手动滑动循环)
- Unmarshaller解析xml文件
- ie浏览器框架不显示_thinkphp框架下后台验证码不显示
- POJ 1141 Brackets Sequence
- QGIS 3. 使用qgis制作三维浮雕地图
- 多线程下载辅助类实现
- 杭州五大湖风景名胜区
- 42多功能高速闭环驱动器使用手册
- 什么是CDN资质?什么情况需要办CDN牌照
- nginx和ftp搭建图片服务器
- 2022年物联网统计数据
- PTA 7-63 黑白子交换棋局
- tomacat出错_繁星漫天_新浪博客
- 一碗酸爽面-倒在黎明前
- 如何构建有效的绩效管理(四)
- 雷达图+南丁格尔玫瑰图
- 软件工程毕业设计课题(12)基于python的毕业设计python校园二手书籍交易网站系统毕设作品源码
- Google Nexus 7 二代 刷入 Kail Net Hunter 过程记录!!!
- host_network_interfaces_slow_mode_thresholds
热门文章
- 中科院计算机专业,中科院计算所博士平均年薪都超过50万了,计算机专业真是可以无脑选的那种...
- 8位12指令微程序CPU设计
- mysql创建用户并授权语句_MySQL创建用户与授权
- 忍者必须死3突然服务器维修,《忍者必须死3》3月12日2:00停服维护公告
- reflections歌词翻译_英文歌曲reflection的歌词翻译
- dipg(dip歌词翻译中文)
- ZIP 压缩解压命令
- 如果生活将我们拆散了
- 计算机无法显示输入字体,电脑中ps输入字体不显示是怎么回事
- html 跑步比赛小游戏,趣味跑步比赛游戏