SDAU 课程练习3 1024
来源:互联网 发布:mac chrome plugins 编辑:程序博客网 时间:2024/05/21 13:44
Problem X
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 7 Accepted Submission(s) : 6
Problem Description
Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerful kingdom in the world. As a result, the people in this country are still very proud even if their nation hasn’t been so wealthy any more.<br>The merchants were the most typical, each of them only sold exactly one item, the price was Pi, but they would refuse to make a trade with you if your money were less than Qi, and iSea evaluated every item a value Vi.<br>If he had M units of money, what’s the maximum value iSea could get?<br><br>
Input
There are several test cases in the input.<br><br>Each test case begin with two integers N, M (1 ≤ N ≤ 500, 1 ≤ M ≤ 5000), indicating the items’ number and the initial money.<br>Then N lines follow, each line contains three numbers Pi, Qi and Vi (1 ≤ Pi ≤ Qi ≤ 100, 1 ≤ Vi ≤ 1000), their meaning is in the description.<br><br>The input terminates by end of file marker.<br><br>
Output
For each test case, output one integer, indicating maximum value iSea could get.<br><br>
Sample Input
2 1010 15 105 10 53 105 10 53 5 62 7 3
Sample Output
511
题目大意:
话说有个人去买东西,每件物品有三个属性,花费,买这件物品的时候手中持有的钱数,价值。
思路:
第二个属性很无语,一开始觉着这是个二维花费的背包来着,后来仔细想了想并不觉的是。然后第二个属性如何考虑呢?
先给出一组例子 5 10 5 5 15 5 先买那个?
假设 第一个为 a 第二个为 b 那么: 如果 a.cost < b.cost 且 a.money > b.money
那么先买 a 没错的对吧? 两个式子加起来 a.cost + b.money < b.cost +a.money
整理 : a.money-a.cost >b.money -b.cost
这个就是选择物品的一个标准。为什么会得到这个呢?你想啊,普通的 0 1 背包是怎么对物品进行选择的如果一个物品的花费小并且价值高,这个优先选的,对吗?这个道理是一样的,选择物品要有顺序的啊。
感想:
最近状态很不稳定,很迷茫。天呐撸。是时候找几个题冷静一下了。
AC代码:
#include<iostream>#include<stdio.h>#include<cstdio>#include<string.h>#include<algorithm>using namespace std;int dp[5005];struct bag{ int wei; int pri; int val;}a[1005];bool cmp (const bag &a,const bag &b){ return a.pri-a.wei<b.pri-b.wei;}int main(){ int n,i,j,k; int Vol; //freopen("r.txt","r",stdin); while(~scanf("%d%d",&n,&Vol)) { for(i=0;i<n;i++) { scanf("%d%d%d",&a[i].wei,&a[i].pri,&a[i].val); } memset(dp,0,sizeof(dp)); sort(a,a+n,cmp); for(i=0;i<n;i++) { for(j=Vol;j>=a[i].wei;j--) { if(j>=a[i].pri) dp[j]=max(dp[j],dp[j-a[i].wei]+a[i].val); } } cout<<dp[Vol]<<endl; } return 0;}
0 0
- SDAU 课程练习3 1024
- SDAU课程练习2 1024
- SDAU 课程练习3 1001
- SDAU 课程练习3 1002
- SDAU 课程练习3 1003
- SDAU 课程练习3 1004
- SDAU 课程练习3 1005
- SDAU 课程练习3 1008
- SDAU 课程练习3 1009
- SDAU 课程练习3 1014
- SDAU 课程练习3 1015
- SDAU 课程练习3 1016
- SDAU 课程练习3 1017
- SDAU 课程练习3 1018
- SDAU 课程练习3 1019
- SDAU 课程练习3 1020
- SDAU 课程练习3 1021
- SDAU 课程练习3 1023
- fmt标签的格式化日期数字
- Redis+Spring缓存实例(windows环境,附实例源码及详解)
- Idea erlang 引入 .hrl文件中的宏,idea 显示Unresolved
- [leetcode]Longest Increasing Subsequence
- Android Graphic SurfaceFlinger 疑难解答
- SDAU 课程练习3 1024
- recyclerView导入问题
- 排序算法总结与C代码
- 线程池续
- 如何划分子网
- VI Package Manager与LABVIEW的连接问题小结
- 10.数值的整数次方(做第二遍时感觉仍有难度,第三次做就没有难度了)
- 数据结构—单链表—直接插入排序
- 驱动开发-字符设备2