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 10 10 15 10 5 10 5 3 10 5 10 5 3 5 6 2 7 3
Sample Output
5 11
题目大意:
有个人去买东西,每件物品有三个属性,花费,买这件物品的时候手中持有的钱数,价值。
思路:
第二个属性很无语,一开始觉着这是个二维花费的背包来着,后来仔细想了想并不觉的是。然后第二个属性如何考虑呢?
先给出一组例子 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;
}