SDAU 课程练习3 1024

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;
}

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值