骄傲的商人(动态规划DP C++)

骄傲的商人
总时间限制: 1000ms 内存限制: 65536kB
描述
最近, iSea去了一个古老的国家。在很长一段时间里,这个国家是世界上最富有、最强大的国家。因此,即使他们的国家不再那么富有,这个国家的人民仍然非常自豪。
那里的商人是最典型的例子。他们每个商人只卖一件商品,价格是Pi,但是如果你的钱少于Qi,他们会拒绝和你交易。iSea会评估每一件商品的价值Vi。
如果他有M单位的钱,iSea能得到的最大价值是多少?
输入
第一行有两个整数N,M(1≤N≤500,1≤M≤5000),表示商人的数量和iSea初始资金。
接下来N行,每一行包含三个整数Pi,Qi和Vi(1≤Pi≤Qi≤100,1≤Vi≤1000),含义见题目描述。
输出
输出一个整数,表示iSea能得到的最大价值
样例输入
【样例输入1】

2 10
10 15 10
5 10 5

【样例输入2】

3 10
5 10 5
3 5 6
2 7 3

样例输出
【样例输出1】

5

【样例输入2】

11

思路点拔:典型的0-1背包问题的变种,就是拿0-1背包问题的代码,都能过第一个样例,但过不了第二个样例,所以这个才叫变种,首先,我们要对商品进行一个排序
按照商人评估的价格减去价格的从小到大排序,为什么呢?,我们可以这样理解,商人评估的价格可以理解为“看你不顺眼值”,“看你不顺眼值”-价格越小,也就说明这件商品越好卖,本题的解法已经很明确了,上代码吧!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,t;
struct node //定义结构体,更方便记录商品的信息
{
    int p,q,v;//p表示商品价格,q表示商人的评估价,v表示价值
}a[10005];
bool cmp(const node &a,const node &b) 
//将商品按照商人评估价-价格的从小到大排序
{
    return a.q-a.p<b.q-b.p;
}
int f[10005];
int main()
{
    scanf("%d %d",&n,&t); //输入n,表示有n
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d %d",&a[i].p,&a[i].q,&a[i].v); //输入每件商品的信息
    }
    sort(a+1,a+n+1,cmp);//排序
    for(int i=1;i<=n;i++)//0-1背包问题
    {
        for(int j=t;j>=a[i].q;j--)
        {
            f[j]=max(f[j],f[j-a[i].p]+a[i].v);//dp
        }
    }
    printf("%d\n",f[t]); //输出答案
    return 0;//结束
}

猜你喜欢

转载自blog.csdn.net/qq_42995099/article/details/82055766