背包九讲之01背包问题

背包九讲之01背包问题

问题描述:

现有n件物品,其中第i件物品的重量为w[i],价值为p[i],有一容量为v的背包,求在不超过背包容量的情况下,使取得的商品的价值总和最大。

问题分析:

        首先,考虑无论采取怎样的选择策略,这n件商品都会产生两种且只会产生两种状态,取或不取。
        先假设,物品的总量n=1,即只有一件物品,那么要想获得最大价值,分为两种情况:其一,若背包容量不小于这一件商品的重量,则取;其二,如背包容量小于这件商品的重量,则放弃(不取)。
        现在,假设n=2,使用枚举所有策略的方法,可以得到共有四种策略:取1不取2,取2不取1,两者都取,两者都不取。
        但是,如果n的数值比较大,很难通过枚举的形式列举所有结果,此时,可以一件一件的去考虑。从第n件物品开始,考虑物品的两种状态,其一、当取第n件商品的时候,问题简化为求解从n-1件物品中选取一定数量的物品,放入容量为v-w[n]的背包中,在不超过背包容量的前提下的最大价值,而我们要求的问题的解,就是简化后的问题的解加上第n件物品的价值;其二、当放弃第n件物品的时候,问题简化为求解从n-1件物品选取一定的数量放入容量为v的背包中,在不超过背包容量的情况下的最大价值,此时,简化后问题的解就是我们要求的最终解。
        考虑完第n件,接下来依次使用同样的方式考虑第n-1件,n-2件。。。
        直到考虑的最后一件,在背包已经从第二件到第n件物品中选取了一定的商品的情况下,如果背包剩余容量还可以放得下第一件物品(即我们最后考虑的物品),那我们就取,如果放不下,就放弃。

算法设计

        使用f[i][v]表示,从前i件物品中选取部分物品放入容量为v的背包中的最大价值。
        仔细分析不难发现,f[i][v]始终等于f[i - 1][v - w[i]] + p[i]和f[i - 1][v]的最大值,即f[i][v] = max(f[i - 1][v - w[i]] + p[i], f[i - 1][v]);
        分析到这,不难得出这是一个很明显的递归问题。
        此处需要注意一点:题目内没有说恰好装满背包而是说在不超过背包容量的情况下,也就是说,实际用到的背包容量可能是v,也可能是v - 1,v - 2甚至是0,所以f[i][v]有可能等于f[i][v - 1],有可能等于f[i][v - 2]……甚至是f[i][0],取决于实际情况而定,如果这n件物品的重量都大于背包总容量,那么f[i][v]就等于f[i][0];

java实现

public class Page1 {
    private static int w[] = {2, 2, 2, 3, 5, 1, 3, 2, 7, 4, 2, 6};//重量
    private static int p[] = {4, 4, 4, 6, 4, 1, 3, 8, 2, 1, 2, 4};//价值
    private static int v = 7;
    public static void main(String[] args) {
        System.out.println(fun(w.length - 1, v));
    }
    public static int fun(int i, int v){
        if(i < 1){
            //当i=0时,即问题分析中分析到最后一件物品时,判断背包剩余容量是否可以放得下这件物品
            if(v >= w[i]){
                return p[i];
            }else{
                return 0;
            }
        }else{

            if(v < w[i]){
                //如果当前考虑的物品的重量大于背包剩余容量,跳过直接考虑下一件
                return fun(i - 1, v);
            }else{
                //判断当前考虑的物品取与不取
                return fun(i - 1, v) > fun(i - 1, v - w[i]) + p[i]?fun(i - 1, v):fun(i - 1, v - w[i]) + p[i];
            }
        }
    }
}

以上是我对01背包的简单理解,如有不到之处,欢迎指正。
未完待续。。。

发布了11 篇原创文章 · 获赞 170 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/u013054715/article/details/52402304