hdu 3466Proud Merchants(01背包 单机调度问题)
2015-12-15 10:46
417 查看
题目链接:【hdu 3466】
这题的核心部分就是这样子的
如果x1 > q2,那先买1号再买2号肯定会出错,因为对于1号来说,dp[j]中j的范围是q1~m, 对于2号来说,dp[j]中的j的范围是q2~m,显然2号的某些dp值是会影响到1号的,所以要先买2号,再买1号
其他情况下1号2号的先后顺序并不影响结果
又因为q必定大于x,所以我们可以先按x来排序,从小到大排,x越大的要越往后,这样才能保证用m元钱买尽可能多的价值
这题的核心部分就是这样子的
<span style="font-size:14px;">for(int i=0; i<n; i++) { for(int j=m; j>=h[i].q; j--) { dp[j]=max(dp[j], dp[j-h[i].p]+h[i].v); } }</span>令x1 = q1-p1 x2 = q2-p2,假设一开始没有排序,按输入的顺序操作,那肯定是先买1号商品,再买2号商品
如果x1 > q2,那先买1号再买2号肯定会出错,因为对于1号来说,dp[j]中j的范围是q1~m, 对于2号来说,dp[j]中的j的范围是q2~m,显然2号的某些dp值是会影响到1号的,所以要先买2号,再买1号
其他情况下1号2号的先后顺序并不影响结果
又因为q必定大于x,所以我们可以先按x来排序,从小到大排,x越大的要越往后,这样才能保证用m元钱买尽可能多的价值
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; int dp[5010]; struct node { int p, q, v, x; friend bool operator < (const node n1, const node n2) { return n1.x<n2.x; } }h[510]; int main() { int n, m; while(~scanf("%d%d", &n, &m)) { memset(dp, 0, sizeof(dp)); for(int i=0; i<n ;i++) { scanf("%d%d%d", &h[i].p, &h[i].q, &h[i].v); h[i].x=h[i].q-h[i].p; } sort(h, h+n); for(int i=0; i<n; i++) { for(int j=m; j>=h[i].q; j--) { dp[j]=max(dp[j], dp[j-h[i].p]+h[i].v); } } printf("%d\n", dp[m]); } return 0; }
相关文章推荐
- is-a, is-like-a, has-a
- 关于去哪儿网的UI自动化测试脚本
- Android代码模拟按下Home键
- [How to]如何自定义plist文件和读取plist文件内容
- 五笔学习资料
- Fragment页面之间传值、基本例子演示、生命周期、兼容性
- 手机对话中的语音处理(一)
- REST简单介绍
- 手机对话中的语音处理(一)
- 最大乘积(Maximum Product,UVa11059)
- Android spinner点击相同选项处理无法响应事件问题,暴力反射
- 第二次编程作业
- Interview with Dennis Ritchie (2003)
- js,replace() 和 正则表达式(regular expression)
- .NET中,在方法参数的类型前加一个OUT是做什么用的
- 项目中自己一直用到的baseAdapter的类
- JSP自定义标签入门学习
- Java中反射机制案例分析
- Tomcat下直接通过ip访问自己的项目
- 浏览器兼容position 定位层级关系