从这里开始我们学习一个新的思想,贪心的思想,仍然是通过例子来学习思想。

问题描述

圣诞节来临了,圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿雪橇最多只能装下重量W的糖果。请问圣诞老人最多能带走多大价值的糖果。

输入:
第一行由两个部分组成,别为糖果箱数正整 n (1 <= n <= 100) ,驯鹿能承受的最大重量正整数 w (0 < w <10000),两个数用空格隔开。其余 n 行每行对应一箱糖果,由两部分组成,分别为一箱糖的价值正整数 v 和重量正整数 w,中间用空格隔开。
输出:
输出圣诞老人能带走的糖果最大总价值,保留 1 位小数 。输出为一行,以换行符结束。

样例输入
4 15
100 4
412 8
266 7
591 2
样例输出:
1193.0

问题分析

按礼物的价值/重量比从大到小依次选取礼物,对选取的礼物尽可能多地装,直到达总重量w。
先对礼物的价值重量比排序,再遍历一遍,所以复杂度为 O(nlogn)

#include<iostream>
#include<algorithm>
using namespace std;const double eps = 1e-6;
struct Candy {int v, w;bool operator < (const Candy & c){return double(v) / w - double(c.v) / c.w > eps;}
} candies[110];int main()
{int n, w;cin >> n >> w;for (int i = 0; i < n; ++i)cin >> candies[i].v >> candies[i].w;sort(candies, candies + n);int totalW = 0;double totalV = 0;for (int i = 0; i < n; i++){if (totalW + candies[i].w < w){totalV += candies[i].v;totalW += candies[i].w;}else{totalV += (double)(w - totalW)*candies[i].v / candies[i].w;break;}}cout << totalV << endl;return 0;
}

证明

直观感觉上面的方法是正确的,现在给出证明。这里用替换法证明。上面我们的计算结果序列为 b1 , b2 , b3 ……,假设有另外一个序列 a1 , a2 , a3 ……,可以使得价值最大。如果我们可以证明两个序列相同,就得出上面贪心的思想是正确的。

将两个序列按价值 / 重量比从大到小排序后得:
序列 1:a1 , a2 , a3……
序列 2依次进行比较:
序列 2:b1 , b2 , b3

价值重量比相同的若干箱糖果,可以合并成一箱。所以两个序列中元素都不复。
将 ai 与 bi 进行对比对于发现的第一个 ai! = bi ,则必有: ai< b < bi,因为序列2是全部物品完全按照价值重量比排序,从大到小挑选的, bi 肯定是未挑选物品中价值重量比最大的,则在序列 1 中,用 bi 这种糖果替代若干重量的 ai 这种糖果,则会使得序列 1 的总价值增加,这和序列 1 是价值最大的取法矛盾。

序列 2 不可能是序列 1 的一个前缀。如果序列 2 为序列 1 的前缀,则序列 1 的总重量大于序列 2 的总重量,大于可以装载的总重量了。

所以:序列 1 = 序列 2

贪心算法

贪心算法的主要思想为:每一步行动总是按某种指标选取最优的操作来进行,该指标只看眼前,并不考虑以后可能造成的影响。 该指标只看眼前,并不考虑以后可能造成的影响。

贪心算法需要证明其正确性。

“圣诞老人礼物”题,若糖果只能整箱拿,则贪心法错误。
考虑下面例子:
3个箱子 (8,6) (5,5) (5,5),雪橇总容量10

43-圣诞老人的礼物相关推荐

  1. Bailian4110 圣诞老人的礼物-Santa Clau’s Gifts【背包+贪心】

    4110:圣诞老人的礼物-Santa Clau's Gifts 总时间限制: 1000ms 内存限制: 65536kB 描述 圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖 ...

  2. 百练-4110 圣诞老人的礼物-Santa Clau’s Gifts

    4110:圣诞老人的礼物-Santa Clau's Gifts 查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 圣诞节来临了,在城市A中圣诞老人准备分发 ...

  3. 贪心算法之圣诞老人的礼物

    问题描述 圣诞节来临了,中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走,圣诞老人的寻路雪橇最多只能装下重量W的糖果,请问圣诞老人最多能带 ...

  4. Poj 圣诞老人的礼物 贪心

    圣诞节?快乐^ - ^ POJ 4110 圣诞老人的礼物(贪心) 描述 圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合 ...

  5. 贪心题目——圣诞老人的礼物

    例题 圣诞老人的礼物 分发糖果,多箱不同的糖果,每箱有自己的价值和重量,每箱都可以拆分成任意散装组合带走,但是雪橇只能装下W重量的糖果,请问圣诞老人最多能敌啊走多大价值的糖果. 输入: 1⃣️n (箱 ...

  6. 4110:圣诞老人的礼物-Santa Clau’s Gifts(java)

    4110:圣诞老人的礼物-Santa Clau's Gifts(java) 描述 圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任 ...

  7. 简单贪心问题-圣诞老人的礼物

    1.题目描述: 圣诞老人要给每家每户从不同的礼物,但是圣诞老人的车只能承载一定的重量.请问圣诞老人该怎样装载礼物才能使得整车的总价值最大. 2.解题思路: 看其每个礼物的性价比,谁的性价比最大,则谁先 ...

  8. 算法基础:圣诞老人的礼物--贪心

    题目: 圣诞节来临了,圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走.圣诞老人的驯鹿雪橇最多只能装下重量W的糖果,请问圣诞老人最多能带走多 ...

  9. 贪心---圣诞老人的礼物

    问题描述: 圣诞节来临了,圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走.圣诞老人的驯鹿雪橇最多只能装下重量W的糖果.请问圣诞老人最多能带 ...

  10. 贪心算法—圣诞老人的礼物(POJ 4110)

    贪心算法--物品可拆分情况求背包最大价值问题 描述 圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走.圣诞老人的驯鹿 ...

最新文章

  1. 给计算机专业学生的忠告
  2. netty 文件传输服务器,Netty之二进制文件传输
  3. 用openCV去除文字中乱入的线条
  4. python字符串截取_Python-变量-No3
  5. Datatable Initialization - 使用objects数据源初始化
  6. zblog php版调用代码,zblog PHP分类列表调用方法
  7. 满分简便代码:1009 说反话 (20分)
  8. table tr省略后鼠标移入显示相应信息_中考来了,人机对话、信息技术考试要求看过来...
  9. lightoj 1382 - The Queue(树形dp)
  10. 预处理_关于食材预处理
  11. css不同大小字体底部对齐
  12. java+动态修改prooper_Spring Aop 权限开发(Java后台管理权限) (完整版)
  13. 【高数】【本科笔记】【第七章 微分方程】【7.2 可分离变量的微分方程】
  14. 做游戏,学编程(C语言) 14 口袋妖怪
  15. 含泪赔了近200万,我终于明白不是什么人都能干电商的……
  16. 陷波滤波器消除周期噪声python_车载功放本底噪声的机理及对策 wdele
  17. Gravity 的测试调研 Gravity - TiDB
  18. 中国最大的系统软件开发外包公司排行榜有哪些
  19. 【狮子数学】chapter6-05-阿贝尔定理(第99讲)
  20. matlab 拐点 c语言,如何使用Matlab找到含噪数据序列的拐点?

热门文章

  1. 机器学习基础:信息论
  2. SpringBoot(二)Error resolving template “xxx”, template might not exist or might not be accessible解决办法
  3. apicloud (第五篇 bmap百度地图一键回到当前位置)
  4. 名悦集团分享秋季汽车保养指南,给你更好的用车体验
  5. android 8.0预装APK为可卸载
  6. 反编译打包apk后无法安装正版apk提示:Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]
  7. centos安装mysql以及mysql-devel
  8. 华为微博回应鸿蒙,果不其然,华为放出终极大招!鸿蒙操作系统下月正式推送。就在刚刚,华为开通了鸿蒙操作系统的官方微博,关注人数已接近八万。 ... - 雪球...
  9. Android中的IPC方式
  10. 包子笔记 - 借贷投资就相当于赌博