1225:金银岛

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 8123     通过数: 4334

【题目描述】

某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n1,n2,...,ns,同时每个种类的金属总的价值也不同,分别为v1,v2,...,vs。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。

【输入】

第1行是测试数据的组数k,后面跟着k组输入。

每组测试数据占3行,第1行是一个正整数w(1≤w≤10000),表示口袋承重上限。第2行是一个正整数s(1≤s≤100),表示金属种类。第3行有2s个正整数,分别为n1,v1,n2,v2,...,ns,vs分别为第一种,第二种,...,第s种金属的总重量和总价值(1≤ni≤10000,1≤vi≤10000)。

【输出】

k行,每行输出对应一个输入。输出应精确到小数点后2位。

【输入样例】

2
50
4
10 100 50 30 7 34 87 100
10000
5
1 43 43 323 35 45 43 54 87 43

【输出样例】

171.93
508.00

【分析】

给定一个载重为M的背包,及n个重量为wi、价值为pi 的物体,要求把物品装满背包,且使背包内的物体价值最大,这类问题称为背包问题。有两类背包问题,即物体可以分割的背包问题,及物体不可分割的背包问题,我们把后者称为0/1背包问题,由0/1背包还可以延伸出很多背包问题。前者为可分割的背包问题,可以用贪心算法求解。贪心的策略是拿性价比高的物体。这一点也好理解,我们去超市免费拿东西,你挑最贵的拿,拿走一台冰箱,显然是傻蛋。如果物品可以分割,你当然应该去拿性价比高的物品,冰箱固然贵重,但其性价比并不贵,你应该直接奔金银首饰专柜去拿,金项链、翡翠这些都是性价比高的东西。

以样例为例,我们来看求解过程。步骤为三步,分别是:

(1)求性价比

(2)按性价比,从大到小排序

(3)拿走最大价值

从前到后物品开始拿,拿的策略是先拿性价比高的。如果当前背包重量 > 某个物品的总重量,那别客气,全拿走;否则,当前背包不足以拿走某个物品,那就能拿多少拿多少。样例数据,第一组,背包承重50,则先把第一个物品(性价比为10的)全拿走,价值=100,背包重量=40。同理,再把第二个物品全拿走,价值=134,背包重量=33,拿第三个,不足以全拿走,只能拿33,价值=134+33*1.15=171.93

【参考代码】

#include<stdio.h>
#include<string.h>
#define N 110
struct goods
{int n;     //总重量 double v;  //总价值 double p;  //性价比
}gds[N],tmp;int main()
{int t,i,j;int w;           //口袋承重上限 int s;           //金属种类 double sum=0;    //最多带走的价值 scanf("%d",&t);while(t--){sum=0;memset(gds,0,sizeof(gds));scanf("%d%d",&w,&s);for(i=0;i<s;i++){ scanf("%d%lf",&gds[i].n,&gds[i].v);gds[i].p = gds[i].v / gds[i].n;}for(i=0;i<s-1;i++)      // 贪心策略是选性价比大的,按照性价比排序{for(j=i+1;j<s;j++){if(gds[i].p<gds[j].p){tmp=gds[i];gds[i]=gds[j];gds[j]=tmp;}}}for(i=0;i<s;i++)       //枚举每件物品{if(w>gds[i].n)        //背包承重大于某物品的总重量,全拿走 {sum+=gds[i].v;w-=gds[i].n;}else                //背包承重小于某物品的总重量,切割物品,能拿多少拿多少 {sum+=gds[i].p*w;w=0;}}printf("%.2lf\n",sum);}return 0;
}

http://ybt.ssoier.cn:8088/problem_show.php?pid=1225

信息学奥赛一本通(1225:金银岛)相关推荐

  1. 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛

    [题目链接] ybt 1225:金银岛 OpenJudge NOI 4.6 1797:金银岛 [题目考点] 1. 贪心 2. 部分背包问题 [解题思路] 该题为部分背包问题 1. 贪心选择性质的证明: ...

  2. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  3. 信息学奥赛一本通 (C++)上机练习

    信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...

  4. 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”

    董永建(右一)在课堂上. 台海网5月14日讯 据福州晚报报道,长乐一中有一位"传奇"老师--15年来,他辅导的学生在全国高中生信息学奥赛中获金牌3人次.银牌3人次.铜牌5人次:在全 ...

  5. 信息学奥赛一本通 提高篇 第5章 矩阵乘法

    例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...

  6. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  7. 《信息学奥赛一本通 提高篇》

    提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...

  8. 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分

    信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...

  9. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  10. 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC

    http://ybt.ssoier.cn:8088/show_source.php?runid=14630195 /* 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC http:/ ...

最新文章

  1. PlayMaker GUI的Normalized
  2. 03.swoole学习笔记--web服务器
  3. spring_boot的logback-spring.xml配置为什么 %d{yyyy-MM-dd} 不起作用
  4. DotNetOpenAuth实践之Webform资源服务器配置
  5. 【大数据入门二——yarn和mapreduce】
  6. selenium python 文本框输入信息_selenium python向富文本框中输入内容
  7. linux命令及实例说明一:cd、ls、rmdir、rm、mkdir
  8. Javascript特效:缓动动画
  9. android仿ios消息框,Android仿IOS提示框
  10. 穷人和富人的距离0.05厘米
  11. Linux优化学习之Load Average (平均负载)
  12. 计算机怎样同时运行多个程序的?进程相关概念介绍
  13. Dataframe中筛选出满足条件的行
  14. ENSP实验超详细步骤(内涵小实验一个)
  15. UVa 12112 - Iceman
  16. 微型计算机BX和AX区别,微机原理及接口技术-习题答案
  17. 基于视频的车辆检测文献综述
  18. Python入门习题大全——人生的不同阶段
  19. Python中既有列表,何必再有数组(NumPy‘s ndarray)?
  20. [附源码]Java计算机毕业设计SSM高校教室管理系统

热门文章

  1. 监控自定义信息 —— ESFramework 4.0 快速上手(10)
  2. 面试官:Java为什么只有值传递?
  3. MiniDao1.8.3 版本发布,轻量级Java持久化框架
  4. 【spring】通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩、包括AJAX)
  5. Windows下用tree命令生成目录树
  6. JAVA字符串占位符替换
  7. JEECG常见问题大全征集
  8. javamail发送邮件的简单实例
  9. shell脚本的简单学习
  10. 自己总结的前端面试题