您的位置:首页 > 其它

动态规划--01背包问题(2)

2017-07-13 14:28 162 查看
   根据前面的分析,我们已经画出了一个表格,表格的最后一个格子是背包的最大价值,在展示代码实现前,我还是想先说一下写代码前的思路,毕竟,有了思路才能行文如流水。没错,下面要说动态规划的步骤。
 
        1. 刻画背包问题的最优解的结构:
  如果一个问题的最优解包含了物品n,那么其余n-1个物品一定构成了子问题在容量为W-Wn时的最优解;如果这个问题的最优解不包含物品n,那么其余n-1个物品一定构成了子问题在容量为W时的最优解。
 
       2. 递归定义最优解的值
       F(n,W) =0    (n=0或W=0);
       F(n,W)=F(n-1,W)   (W<Wn);
       F(n,W) = max(F(n-1,W),F(n-1,W-Wn) + Vn)  (n>0且Wn<=W)
 
      3. 计算背包问题最优解的值(终于可以看代码了)

 
/**
* 01背包问题:有一个背包可盛的重量为4,现有3个物品,重量和价值如下表,问:如何让包内装入的物品具有最大的总价值?
* Created by gu.haiyan on 2017/7/10.
*/
public class DynamicProgramming_01bag {

//动态规划法求解
public static int getMostValueByDP(int n, int w, int[] values, int[] weights){

int[] preResults = new int[w+1];
int[] results = new int[w+1];

//填充表格第一行,也就是只有一个物品的情况
for (int i = 1; i <= w; i++) {
if (i < weights[0]){
preResults[i] = 0;
}else {
preResults[i] = values[0];
}
System.out.print(" " + preResults[i]);
}
System.out.println("");

//填充表格剩余行数
for (int i = 1; i < n; i++) {
for (int j = 1; j <= w; j++) {
if (j < weights[i]){
results[j] = preResults[j];
System.out.print(" " + results[j]);
}else {
results[j] = Math.max(preResults[j],preResults[j-weights[i]] + values[i]);
System.out.print(" " + results[j]);
}
}
preResults = results;
System.out.println("");
}
return results[w];
}

public static void main(String[] args) {
int[] g = {1500,3000,2000};
int[] p = {1,4,3};
int gold = getMostValueByDP(3,4,g,p);
System.out.println("最大价值是 " +gold);
}
}


  运行结果:

  


  到这里我们已经求得了背包的最大价值。但,我们究竟在包里放入了哪几个物品该怎么算呢?
  未完待续……
 
  小编嘱咐:
  一定要自己把那个递归的定义式写一写,确保自己明白了哦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: