zoukankan      html  css  js  c++  java
  • Proud Merchants(01背包)

    Proud Merchants

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
    Total Submission(s) : 12   Accepted Submission(s) : 5
    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.
    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.
    If he had M units of money, what’s the maximum value iSea could get?

     
    Input
    There are several test cases in the input. Each test case begin with two integers N, M (1 ≤ N ≤ 500, 1 ≤ M ≤ 5000), indicating the items’ number and the initial money. 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. The input terminates by end of file marker.
     
    Output
    For each test case, output one integer, indicating maximum value iSea could get.
     
    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
     代码:自己原本想的挺对的,越想越复杂了,其实就个排序;题意就是说买东西多了个限制,限制你必须有多少钱才能买;
     

    解题思路与顺序有关的01背包。初看之下似乎和普通背包差不多,判容量大于q时才装。但是这会出大问题,如果一个物品p = 5,q = 7,一个物品p = 5,q = 9,如果先算第一个,那么当次只有7,8...m可以进行状态转移,装第二个物品的时候9,10..m进行转移,第二个物品转移就可以借用第一个物品的那些个状态,而第二个物品先转移,第一个再转移则不能。当然,还有价格有关,当限制一样价格不同时顺序就影响结果。一种组合的排序策略--限制又小价格又贵的先选,也就是q-p小的先选。为什么这样呢?A:p1,q1 B: p2,q2,先选A,则至少需要p1+q2的容量,而先选B则至少需要p2+q1,如果p1+q2>p2+q1,那么要选两个的话的就要先选A再选B,公式可换成q1-p1 > q2-p2,就按这样的方法排序最后的顺序就是最优的顺序。

    该题要确保P[i]-Q[i]小的先被”挑选“,差值越小使用它的价值越大(做出的牺牲越小).

    代码:

     

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #define MAX(x,y)(x>y?x:y)
     5 const int MAXN=5010;
     6 const int MAXM=510;
     7 struct Node{
     8     int p,q,v;
     9 };
    10 int cmp(const void *a,const void *b){
    11     if((*(Node *)a).q-(*(Node *)a).p<(*(Node *)b).q-(*(Node *)b).p)return -1;
    12     else return 1;
    13 }
    14 Node dt[MAXM];
    15 int bag[MAXN];
    16 int main(){
    17     int N,M;
    18     while(~scanf("%d%d",&N,&M)){
    19         memset(bag,0,sizeof(bag));
    20         for(int i=0;i<N;i++)scanf("%d%d%d",&dt[i].p,&dt[i].q,&dt[i].v);
    21         qsort(dt,N,sizeof(dt[0]),cmp);
    22         for(int i=0;i<N;i++)
    23             for(int j=M;j>=dt[i].q;j--){//
    24                     if(j>=dt[i].p){//
    25                         bag[j]=MAX(bag[j],bag[j-dt[i].p]+dt[i].v);
    26                     }
    27             }
    28             printf("%d
    ",bag[M]);
    29     }
    30     return 0;
    31 }

     

     

  • 相关阅读:
    Sublime Text3 无法调出package controll问题
    Python标准库-enumerate用法
    设计模式学习-简单工厂模式(python3)
    【IO流】java中文件路径(相对路径、绝对路径)相关类及方法
    nginx安装教程(详细)
    nginx -stream(tcp连接)反向代理配置 实现代理mysql以及文件上传
    【单例模式】懒汉式的线程安全问题 volatile的作用
    jsonp协议 java服务端、JQuery客户端 简单实现原理
    MyBatis原理,Spring、SpringBoot整合MyBatis
    【JavaSE】运行时类型信息(RTTI、反射)
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4761578.html
Copyright © 2011-2022 走看看