1. 程式人生 > >程式設計之美之飲料供貨問題

程式設計之美之飲料供貨問題

對程式設計之美中飲料供貨問題的解法一進行了優化,當然依然是根據原書中虛擬碼之後的說明文字所提示,之間附上程式碼:
//原書中虛擬碼
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),自上而下,屬於演繹。