动态规划---0-1背包

引言:0-1背包是算法考试中经常会出现的考题,因此掌握它的计算是十分有必要的,下面是自己学习0-1包的一些笔记,仅供参考:
一:问题提出:
给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为c。问应该如何选择装入背包的物品使得装入背包中的物品总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或者不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。
此问题形式化描述为:给定c>0,Wi>0,Vi>0,1<=i<=n;找出n元0-1向量(x1,x2……xn),xi属于{0,1}1<=i<=n。

111.png

所以0-1背包问题就是一个特殊的整数规划问题:


动态规划---0-1背包_第1张图片
222.png

1:最优子结构性质:
0-1背包问题具有最优子结构性质。设(y1,y2,y3,y4….yn)是所给0-1背包问题的一个最优解,则(y2,y3,y4….yn****)是下面相应子问题的一个最优解:

333.png

2:递归关系:
设所给的****0-1
背包问题的子问题
动态规划---0-1背包_第2张图片
444.png

的最优值为m(i,j),即m(i,j)是背包容量为j时,可以选择物品为i,i+1….,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,可以建立计算m(i,j)递归式如下:
动态规划---0-1背包_第3张图片
555.png

3:具体算法:

public class Package {
    //背包的容量
    private int weight;
    //一组物品的重量
    private int[] arrW;
    //相应物品的质量
    private int[] arrV;
    //表示当容量为j是的最大价值
    public int[][] c;
    //初始化这些值
    public Package(int length,int weight,int[] arrW1,int[] arrV1){
        this.weight =weight;
        arrV = new int[length+1];
        arrW= new int[length+1];
        c = new int[length+1][weight+1];
        //为了确保后面计算时从1开始,我们在初始化矩阵时需要注意
        for(int i=1;i

你可能感兴趣的:(动态规划---0-1背包)