1024 ProblemX
2016-05-19 15:14
260 查看
题意:
给出n件物品,手里的总钱数m,每件物品的价值p,最低要有多少钱才能买q,购买的价格v 求最大价值。
思路:
这是一个背包问题,问题的关键就在于按什么顺序排序也就是先买哪个后买那个。
首先设有两个物品
p1,q1,v1—-A物品
p2,q2,v2—-B物品
如果先买A后买B,手里的钱至少需要q1+p2,如果先买B后买A 手里需要q2+p1,
假设先买A的代价下 那么就是 q1+p2
给出n件物品,手里的总钱数m,每件物品的价值p,最低要有多少钱才能买q,购买的价格v 求最大价值。
思路:
这是一个背包问题,问题的关键就在于按什么顺序排序也就是先买哪个后买那个。
首先设有两个物品
p1,q1,v1—-A物品
p2,q2,v2—-B物品
如果先买A后买B,手里的钱至少需要q1+p2,如果先买B后买A 手里需要q2+p1,
假设先买A的代价下 那么就是 q1+p2
// ConsoleApplication32.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<fstream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; struct node { int p, q, v; } a[555]; int cmp(node x, node y) { return x.q - x.p<y.q - y.p; } int main() { fstream cin("E:/C++/IN/aaa.txt"); int n, m, i, j; int dp[5555]; while (cin>>n>>m&&n&&m) { for (i = 0; i < n; i++) cin >> a[i].p >> a[i].q >> a[i].v; memset(dp, 0, sizeof(dp)); sort(a, a + n, cmp); for (i = 0; i<n; i++) { for (j = m; j >= a[i].q; j--) { dp[j] = max(dp[j], dp[j - a[i].p] + a[i].v); } } cout << dp[m] << endl; } return 0; }
相关文章推荐
- ClassyShark查看apk包信息
- 工厂模式和构造函数
- 二叉树的原理和实现
- Hibernate实现将图片保存至数据库、显示在页面
- java代码获取服务器的地址
- Python包帮助文档
- PassCode - 打造一个简单易用的安全锁类库
- NOJ_1005_多项式加法(采用尾插法建立单链表的运用)
- hanio 塔和递规的理解。
- [转]struts1.2的action参数配置
- jquery复选框操作
- 1008. 数组元素循环右移问题 (20)
- datetime的时间处理逻辑
- 如何通过OWA登录界面修改域用户的密码
- 表的复杂查询-—多表查询
- 如何通过OWA登录界面修改域用户的密码
- Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules
- Unity之AssetPostprocessor学习一
- Matlab-直方图
- java springMVC里搭建redis