用动态规划解决背包问题

  求解背包问题:     
      给定 n 个背包,其重量分别为 w1,w2,……,wn, 价值分别为 v1,v2,……,vn    
      要放入总承重为 totalWeight 的箱子中,     
      求可放入箱子的背包价值总和的最大值。    
         
  NOTE:使用动态规划法求解 背包问题    
      设 前 n 个背包,总承重为 j 的最优值为 v[n,j], 最优解背包组成为 b[n];    
  求解最优值:    
      1. 若 j < wn, 则 : v[n,j] = v[n-1,j];    
      2. 若  j >= wn, 则:v[n,j] = max{v[n-1,j], vn + v[n-1,j-wn]}。    
  求解最优背包组成:    
      1. 若 v[n,j] > v[n-1,j] 则 背包 n 被选择放入 b[n],     
      2. 接着求解前 n-1 个背包放入 j-wn 的总承重中,     
         于是应当判断 v[n-1, j-wn] VS v[n-2,j-wn], 决定 背包 n-1 是否被选择。    
      3. 依次逆推,直至总承重为零。              
  重点: 掌握使用动态规划法求解问题的分析方法和实现思想。    
  分析方法: 问题实例 P(n) 的最优解S(n) 蕴含 问题实例 P(n-1) 的最优解S(n-1);    
             在S(n-1)的基础上构造 S(n)     
    实现思想:自底向上的迭代求解 和 基于记忆功能的自顶向下递归 。
背包建模:  
  1.     public class Knapsack {        
  2.               
  3.         /** 背包重量  */        
  4.         private int weight;        
  5.                 
  6.         /** 背包物品价值  */        
  7.         private int value;        
  8.         /***    
  9.          * 构造器    
  10.          */        
  11.         public Knapsack(int weight, int value) {        
  12.             this.value = value;        
  13.             this.weight = weight;        
  14.         }        
  15.         public int getWeight() {        
  16.             return weight;        
  17.         }        
  18.                 
  19.         public int getValue() {        
  20.             return value;        
  21.         }        
  22.                 
  23.         public String toString() {        
  24.             return "[weight: " + weight + " " + "value: " + value + "]";          
  25.         }        
  26.     }  
Java代码:
  1. public class KnapsackProblem {        
  2.                 
  3.         /** 指定背包 */        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值