贪心算法 笔记

背包相关问题。
1. 给出n 个物品,第i 个物体的重量为 wi , 选择尽量多的物体,使得总重量不超过 C .
按照物品重量从到小排序
2. 部分背包问题。有 n 个物体,第 i 个物体的重量为 wi ,价值为 vi ,在总重量超过C的情况下让总价值尽量高。
按照“价值除以重量的值”排序

  1. 乘船问题。 有 n 个人,第 i 个人的重量为 wi ,每艘船的最大载重量均为 C , 且最多只能乘两个人。用最少地船装载所有人。
    从两个极端考虑。
    先按重量从小到大排序看看。
    3.1先考虑最重的人。最重的人贪心选择能和他一起坐船中人的集合中最轻的人。
    3.2 先考虑最轻的ren。 最轻的人贪心选择能和他一起坐船的人中最重的人。
    双指针,一首一尾,遍历一遍即可。

4.区间相关问题。
4.1 选择不相交的区间。数轴上有 n 个开区间 (ai,bi) ,选择尽量多个区间,使得这些区间两两没有公共点。
区间按照 b1b2b3 排序。
4.1.1 a1>a2 选择区间1
4.1.2 a1a2 选择区间1
选择区间1 后,需要把所有和区间1相交的区间排除在外,需要记录上一个被选择的区间编号。从头到尾扫描一遍可完成贪心过程,得到正确结果。

4.2 区间选点问题。数轴上有 n 个闭区间 [ai,bi] 。取尽量少的点,使得每个区间内都至少有一个点。
把所有的区间按 b 从小到大排序(b相同时,安装a从大到小排序),贪心策略选择第一个区间的最后一个点。

4.3 区间覆盖问题。数轴上有 n 个闭区间 [ai,bi] 。选择尽量少地区间覆盖一条指定线段 [s,t]

先进行一次预处理。每个区间在 [s,t] 外的部分都应该预先被切掉。
把各区间按照 a 从小到大排序。如果区间1的起点不是 s ,无解。否则选择起点在s的最长区间。选择此区间 [ai,bi] 后,新的起点应该设置为 bi ,并且忽略所有区间在 bi 之前的部分。

  1. 哈夫曼编码问题
    原理和性质:贪心策略和最优子结构
    程序实现:
    5.1 按照频率把所有的字符排序成表P,算法复杂度 O(nlogn)
    5.2 新开辟一个节点队列Q, 其目的装放哈夫曼树合并的父节点。
    5.3 从P或Q 选取两个频率最小的节点合并成一个父节点,放父节点放入Q中,由于后合并的父节点频率比先合并的频率大,因此Q内的元素是有序的。
    5.4 重复5.3 直到P 和 Q为空。时间复杂度 O(n)

猜你喜欢

转载自blog.csdn.net/lilele12211104/article/details/79872585