深入思考0-1背包问题

本文深入探讨了0-1背包问题,对比了穷举法、整数规划和动态规划的解题思路。强调动态规划的最优子结构特性,并通过递归与备忘录、自底向上的方法降低复杂度至O(nW)。通过实例解析动态规划的实现过程,展示了动态规划在解决背包问题中的高效性和实用性。
摘要由CSDN通过智能技术生成

问题描述:

  房间中有n件物品,每件物品具有固定的重量和价值,在背包总重量不超过W的情况下,如何组合物品使背包中物品总价值最大。
  为了便于表示,首先对问题进行形式化建模。集合 S n ={ i|i=0,1,...,n1}  表示可选取的物品集合, i  表示每件物品的编号, |S n |=n  表示物品数目。 w i   v i   分别表示每件物品的重量和价值, W  表示背包承受重量的最大值。令 D={B|B2 S n   iB w i W}  表示所有满足最大重量 W  限制的方案集合,则最优选取方案可以表示为: F(S n ,W)=C  ,其中 CD,C    D iC v i  jC     v j   ,即集合 C  是所有可能的选取方案中价值最大的。我们用 fS n ,W= iF(S n ,W) v j   表示最优选择方案对应的最优值。

解题思路:有三种主要方法

1. 穷举法
这是是一个笨办法,但是对于问题规模小,并且不要求实时性的情况下,简单快捷。穷举法对应的Java代码如下:
public static int exhaustive(int[] weight,int[] value,int W){
        int length=weight.length;
        int maxValue=-1;    
        //遍历所有子集,用length个二进制位表示每一个物品是否被选中
        int[] mask=new int[length];//掩码用于取出每一个二进制位
        for(int k=0;k<length;k++){
            mask[k]=0x01<<k;
        }
        for(int i=0;i<Math.pow(2, length);i++){
            int sumWeight=0;
            int sumValue=0;
            for(int j=0;j<length;j++){
                //当前物品被选中
                if((i&mask[j])>0){
                    sumWeight+=weight[j];
                    sumValue+=value[j];
                }
            }
            //重量限制与最优值更新
            if(sumWeight<=W && sumValue>maxValue)
                maxValue=sumValue;
        }
        return maxValue;
    }
穷举法的输入规模是指数级别的,为 2 |S n |  
2.整数规划
  整数规划是指一类要求问题中的全部或一部分变量为整数的数学规划,若在线性模型中,变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法往往只适用于整数线性规划。0-1背包问题是典型的整数线性规划问题。MATLAB中提供了 intlinprog 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值