当前位置:嗨网首页>书籍在线阅读

51-算法设计

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.9.2 算法设计

有n个物品,每个物品的重量为w[i],价值为v[i],购物车的容量为W。选若干个物品放入购物车,在不超过容量的前提下使获得的价值最大。

(1)确定合适的数据结构

采用一维数组w[i]、v[i]来记录第i个物品的重量和价值;二维数组用c[i][j]表示前i件物品放入一个容量为j的购物车可以获得的最大价值。

(2)初始化

初始化c[][]数组0行0列为0:c[0][j]=0,c[i][0] =0,其中i=0,1,2,…,n,j=0,1,2,…,W。

(3)循环阶段

  • 按照递归式计算第1个物品的处理情况,得到c[1][j],j=1,2,…,W。
  • 按照递归式计算第2个物品的处理情况,得到c[2][j],j=1,2,…,W。
  • 以此类推,按照递归式计算第n个物品的处理情况,得到c[n][j],j=1,2,…,W。

(4)构造最优解

c[n][W]就是不超过购物车容量能放入物品的最大价值。如果还想知道具体放入了哪些物品,就需要根据c[][]数组逆向构造最优解。我们可以用一维数组x[i]来存储解向量。

  • 首先i=n,j=W,如果c[i][j]>c[i−1][j],则说明第n个物品放入了购物车,令x[n]=1,j−=w[n];如果c[i][j]c[i−1][j],则说明第n个物品没有放入购物车,令x[n]=0。
  • i−−,继续查找答案。
  • 直到i=1处理完毕。

这时已经得到了解向量(x[1],x[2],…,x[n]),可以直接输出该解向量,也可以仅把x[i]=1的货物序号i输出。