CLRS第十六章思考题

思考题16-1

首先证明硬币找零问题有最优子结构,设我们有找 n 美分的问题的最优解,且知道这个最优解使用了一个 c 美分的硬币,设这个最优解使用了 k 个硬币,则我们认为解决这个问题的最优解要用到问题 nc 美分且使用了 k1 个硬币。很明显,解决 nc 美分且使用了 k1 个硬币使用了 n 美分的解,如果我们有小于 k1 个硬币就找了 nc 美分问题,则我们可以使用这个解法来代替 n 美分问题,并且少于 k 个硬币,这与最优解矛盾。
a) q=n/25 ,剩下 n=n mod 25 美分, d=n/10 ,剩下 d=nmod 10k=d/5 ,剩下 k=d mod 5 ,其余的全是 1 美分硬币,总结就是每次选取最大的零钱,若面额大于选的纸币,则可以兑换,否则选取较小的零钱,以此类推。

b) 证明略。

c) 现在有 30 美分,硬币面额是 25,10,1 ,按照贪心算法得到的解是 25,1,1,1,1,1 ,即 6 个硬币,实际上应该是 3 10 美分的硬币才是最优解。

d) 由最开始的证明可知找零问题有最优子结构,所以可以用动态规划来做。
j 美分的钱用了 c[j] 个硬币来找零,现在有面值分别为 d1,d2,...,dk 的零钱,且存在 1 美分的硬币。若 j 美分使用了一个面额为 di 的硬币,则有 c[j]=1+c[jdi] ,对所有 j0 c[j]=0

c[j]={01+min1ik{c[jdi]}if j≤0if j > 1

COMPUTE-CHANGE(n, d, k)
    let c[1..n] and denom[1..n] be new arrays
    for j = 1 to n
        c[j]  = ∞
        for i = 1 to k
            if j≥di and 1 + c[j-di]  < c[j] 
                c[j] = 1 + c[j-di]
                denom[j] = di
    return c and denom

GIVE-CHANGE(j, denom)
    if j > 0
        give one coin of denomination denom[j]
        GIVE-CHANGE(j-denom[j], denom)

附上运行代码

#include <iostream>
#include <algorithm>
using std::cout;
using std::endl;

void GIVE_CHANGE(int *denom,int j)
{
    if(j > 0)
    {
        cout << "give one coin of denomination " << denom[j] << endl;
        GIVE_CHANGE(denom,j-denom[j]);
    }
}

void COMPUTE_CHANGE(int *d,int n,int value)//n个硬币面额的数组和需要找零的面值value
{
    int *c = new int[value+1];
    int *denom = new int[value+1];
    c[0] = 0;
    for(int j = 1; j <= value; j++)
    {
        c[j] = INT_MAX;
        for(int i = 0; i < n; i++)
        {
            if(j >= d[i] && 1 + c[j-d[i]] < c[j])
            {
                c[j] = c[j-d[i]] + 1;
                denom[j] = d[i];
            }
        }
    }
    GIVE_CHANGE(denom,value);
    delete []c;
    delete []denom;
}

int main()
{
    int value = 130;
    int d[] = {10,25,1};
    std::sort(d,d+3);
    COMPUTE_CHANGE(d,3,value);
    return 0;
}

思考题16-2

a) 先对任务集合按照完成时间长度排序,完成时间越小排在越前面。排序之后是 p1p2...pn 。然后依次选择这些任务调度。 cavg=(p1+(p1+p2)+...+(p1+p2+...+pn))/n 。排序时间是 O(nlgn) 。所以是 O(nlgn) 的复杂度。

b) 采用最短剩余时间调度算法(Shortest Remaining Time First(SRTF))。运行时间是 O(nT)

思考题16-3—16-5

答案略

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值