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
原创粉丝点击