编程之美之饮料供货问题

对编程之美中饮料供货问题的解法一进行了优化,当然依然是根据原书中伪代码之后的说明文字所提示,之间附上代码:
//原书中伪代码
int Cal(int V, int T)
{
    opt[0][T] = 0;
    for(int i=1;i<=V;i++)
    {
        opt[i][T] = -INF;
    }
    for(int j=T-1;j>=0;j--)
    {
        for(i=0;i<=V;i++)
        {
            opt[i][j] = -INF;
            for(int k=0;k<=C[j];k++)
            {
                if(i<k*V[j])
                {
                    break;
                }
                int x = opt[i-k*V[j]][j+1];
                if(x != -INF)
                {
                    x += H[j]*k;
                    if(x>opt[i][j])
                    {
                        opt[i][j] = x;
                    }
                }
            }
        }
    }
    return opt[V][0];
}

//优化伪代码段
int Cal2(int V, int T)
{
    opt[0][1] = 0;
    for(int i=1;i<=V;i++)
    {
        opt[i][1] = -INF;
    }
    for(int j=T-1;j>=0;j--)
    {
        for(int i=0;i<=V;i++)
        {
            opt[i][0] = -INF;
            for(int k=0;k<=C[j];k++)
            {
                if(i<k*V[j])
                {
                    break;
                }
                int x = opt[i-k*V[j]][1];
                if(x != -INF)
                {
                    x += H[j]*k;
                    if(x>opt[i][0])
                    {
                        opt[i][0] = x;
                    }
                }
            }
        }
        for(int i=0;i<=V;i++)
        {
            opt[i][1] = 0;
        }
    }
    return opt[V][0];
}

声明:伪代码大部分是从原书中拷贝过来的,只是做了较少的修改。

解法一,自下而上,属于归纳;解法二(见原书P45),自上而下,属于演绎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值