问题一
设x1, x2, …., xn是实数轴上的n个点,尝试用单位长度的闭区间覆盖这些点,设计贪心算法求解需要多少单位长度闭区间?
伪代码
sort(x)//将各点按照横坐标从小到大排序
length = getLength(x)
sum = 0
maxX = x[0] - 1
for i = 0 to length - 1
if maxX < x[i]
maxX = x[i] + 1
sum++
return sum
时间复杂度是 O ( n l g n ) O(nlgn) O(nlgn)
问题二
设有n个物品,第i个物品的价值是vi、重量是wi, 假设物品可以任意分割,给定一个背包,其能容纳最大重量为C,求该背包能容纳物品的最大价值。要求写出伪代码并分析算法正确性和复杂性。
问题分析
计算物品的性价比,按照性价比从大到小排序,首先装性价比最大的物品,直到该物品全部装进去或者背包已满,对剩余物品同样。
sort(goods) //对物品按照性价比从大到小排序,即按照vi/wi排序
count = length(goods)//计算商品数量
value = 0//记录放进背包的商品价值
for i = 0 to count - 1
if wi < C
C -= wi
value += vi
else
value += vi * C / wi
break
return value
正确性分析
贪心选择性:如果给定背包可以盛装物品的最大价值是valueMax,除了单位容积之外的价值是value.对于背包的这个单位容积,如果不选择当前可选的性价比最大的物品vMax,而是选择了性价比更小的物品vMin,则背包价值是vMin+value,比VMax+value小,与当前盛装方案是最佳的矛盾。所以,对于单位容积,必须选择当前可以放下的性价比最大的物品。
最优子结构:反证法即可。
时间复杂性分析
排序是制约算法时间复杂性的瓶颈
问题三(别忘记写)
考虑多背包问题,即给定n个物品,其中物品i的价格是vi, 重量是wi,有m个背包,背包j最大能装物品的重量均为Bj,求这些背包能够装下物品的最大价格,其中每个物品要么完全放入背包,要么不放入。
对于此问题一个显然的贪心算法如下:利用精确算法选择物品装第一个背包,然后移除装入第一个背包的物品,然后按此方法依次装后面的背包。
(a) 证明此贪心算法不能给出精确解,在所有Bj都相等时也是如此。
(b) 证明当所有Bj都相等时,此贪心算法是一个常近似比的近似算法。
问题四
设有6种硬币,面值是1分, 2分, 5分, 1角,5角,1元,给定一个钱数n,求出一个硬币组合,要求面值总和为n且硬币个数最少,假设每种硬币个数无限。要求
写出伪代码并分析算法正确性和时间复杂性。
money[0] = 0.01
money[1] = 0.02
money[2] = 0.05
money[3] = 0.1
money[4] = 0.5
money[5] = 1
sum = 0
while n != 0
for i = 5 downto 0
if n >= money[i]
n -= money
sum++
break
return sum
问题五(第二问)
给定一个城市集合,一些城市之间由高速公路连接,这些城市和城市之间的高速公路构成了一个无向图G = (V, E),每条边e=(u, v)E表示一条城市u到v的高速公路,e上的权重le表示该高速公路的长度。一辆车需要从城市s到达城市t,但该车的油箱存油最多能走L公里,每个城市有一个加油站,但是城市之间没有加油站,因此,只有当le<L的时候,才能走e对应的高速公路。回答下列问题:
(1) 设计一个时间复杂性O(E)的算法,判定是否这辆车能够从城市s走到城市t。
(2) 如果准备买一辆新车,需要知道保证车从城市s成功走到城市t最少要用多大的油箱,请设计时间复杂性为O((|V | + |E|) log |V |)的算法解决该问题。
分析
- 直接bfs搜索即可。可以通行的路满足耗油小于等于油箱存油,并且没走过。
- 不会,待更
问题六
考虑特殊的0-1背包问题:有n个物品,每个物品i价值和重量都是wi,背包能容纳物品的最大重量是C, 选择背包能容纳的物品集合,使得这些物品价值之和最大。回答下列问题:
(1)若物品的重量(价值)分别是1, 2, …,
2
n
−
1
2^{n-1}
2n−1, 证明该0-1背包问题可以用贪心法求解并写出该贪心算法的伪代码。
(2)请写出一个物品重量(价值)序列,使得上述贪心法无法得到最优解。
- 贪心选择性:每次选择可以装下并且物品重量最大的。
对于一个可盛装的最大重量为C的背包,方案A构成了最优解,其中一定包含重量小于等于C的重量最大的物品,其重量为 2 k 2^{k} 2k则 2 k + 1 > C 2^{k+1}>C 2k+1>C,如果不包含这个物品,选择 ∑ i = 0 k − 1 2 i \sum_{i=0}^{k-1}2^i ∑i=0k−12i,其值小于 2 k 2^k 2k不是最优选择,所以具有贪心选择性
优化子结构:对于一个最优解A,去掉贪心选出来的物品good,构成的选择方案是针对子问题的最优解 B 1 B_1 B1,如果不是,则选择子问题的最优解 B 2 B_2 B2,则 B 2 B_2 B2和good构成的解比A更优,与A是最优解矛盾。所以该问题有最优子结构。
重量 | 3 | 4 | 8 |
---|---|---|---|
价值 | 5 | 5 | 5 |
背包最大重量是8
未完待更