对编程之美中饮料供货问题的解法一进行了优化,当然依然是根据原书中伪代码之后的说明文字所提示,之间附上代码:
//原书中伪代码
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),自上而下,属于演绎。