算法设计练习题——贪心法

  1. 设x1, x2, …., xn是实数轴上的n个点,尝试用单位长度的闭区间覆盖这些点,设计贪心算法求解需要多少单位长度闭区间?

    贪心选择性:将n个点按照坐标从小到大排序,则第一个点y1构成的区间[y1,y1+1]一定包含在某个优化解中
    优化子结构:设一个优化解为T,则T’=T-[y1,y1+1]为X’=X-{y1}∪{yi|yi-y1<=1}的优化解

  2. 设有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
    
  3. 设有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	
    
  4. 设有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)
    
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值