-
设x1, x2, …., xn是实数轴上的n个点,尝试用单位长度的闭区间覆盖这些点,设计贪心算法求解需要多少单位长度闭区间?
贪心选择性:将n个点按照坐标从小到大排序,则第一个点y1构成的区间[y1,y1+1]一定包含在某个优化解中
优化子结构:设一个优化解为T,则T’=T-[y1,y1+1]为X’=X-{y1}∪{yi|yi-y1<=1}的优化解 -
设有n个物品,第i个物品的价值是vi、重量是wi, 假设物品可以任意分割,给定一个背包,其能容纳最大重量为C,求该背包能容纳物品的最大价值。要求写出伪代码并分析算法正确性和复杂性。
贪心选择性:令xi=vi/wi,即单位重量的价值的按照从大到小对进行排序为x11,x12,…x1w1,x21,x22,…x2w2,则对于x11一定包含在某个优化解中。
优化子结构:设T为一个优化解,则T-x11为C-1的优化解x=sort(vi/wi) t=0 w=0 for i=0 to x.length do if w <= C -1 then t = t +x(i) w = w+1 else break t = t + x(i)*(C-w) return t
-
设有6种硬币,面值是1分, 2分, 5分, 1角,5角,1元,给定一个钱数n,求出一个硬币组合,要求面值总和为n且硬币个数最少,假设每种硬币个数无限。要求
写出伪代码并分析算法正确性和时间复杂性。贪心选择性:将面值按照从大到小排列为a,则a1包含在某个优化解中
证明:假设a1不包含在某个优化解中,则设优化解为T,其中最大面值为a’1,则a’1<a1,且T-a1’+a1>n,因此去掉a1’使用a1得到的面值更大,即如果得到总和为n使用硬币更小。
优化子结构:设T为一个优化解,则T-a1为n-a1的优化解a=Sort(S) w =0;i=1; while w < n and i <= 6 do if n-w >= ai then Add(ai,M) w=w+ai else i++; return M
-
设有n个正整数,将它们连接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。
输入是n个正整数,输出是这n个正整数连成的最大多位整数,要求用贪心法求解该问题。答案要求包含以下内容:(1)证明问题具有贪心选择性;(2)证明问题具有优化子结构;(3)写出算法伪代码并分析算法的时间复杂度。(1) 贪心选择性:将正整数按照位数从左到右,从大到小进行排序,为x【1:n】,则x1一定为一个最大整数解中的第一项
证明: 设优化解T为t1t2…tn
若t1=x1,成立
若t1不等于x1。则设x1在ti处
T’为将t1和ti交换位置得到的数
则T和T’位数相同,且此时T’第一位数字>T第一位数字,所以T’值>T
与T为最打证书矛盾
(2)优化子结构:
设一个优化解为T=t1t2…tn,则T’=t2t3…tn为X’={x1,x2,…xn}-{t1}的优化解。
证明:
假设T’不是X’的优化解,则存在一个T’‘为X’的优化解,且T’’>T’
则t1T’‘的值>t1T’的值,此时t1T’'为X优化解,矛盾
(3)伪代码X=sort(S) ---O(Kn)k为最大位数 max=0 for i=0 to i.length-1 do ---O(n) max=max*(10^Dight(Xi)) -- Dight(xi)求位数O(1) max=max+xi return max 时间复杂度:O(n)
算法设计练习题——贪心法
最新推荐文章于 2022-10-27 23:27:04 发布