背包九讲之多重背包问题

来源:互联网 发布:深圳爱玩网络 编辑:程序博客网 时间:2024/05/01 18:27

背包九讲之多重背包问题

注意事项:

        多重背包的理解请建立在01背包与完全背包的基础上,在了解01背包与完全背包后,多重背包即可不攻自破。
        01背包http://blog.csdn.net/u013054715/article/details/52402304
        完全背包http://blog.csdn.net/u013054715/article/details/52403049

问题描述

        不同于01背包也不同于完全背包,多重背包问题限制了每种物品的件数,即不再无限量也不一定仅仅一件,n件物品,其中第i种物品的件数表示为n[i],重量为w[i],价值为p[i],从n件物品中选取部分放入容量为v的背包,在不超过背包容量的前提下,使得背包总价值对打。

问题分析

        解法一:同完全背包问题:可以将其转化为01背包问题求解,此处不再细说。
        解法二:第i种物品,有n[i] + 1种状态,即取一件,取两件。。。取n[i]件,(当n[i]大于v / w[i]时永远达不到这一种状态,此处可优化)。可以通过比较这n种状态的最大值进行迭代递归即可。当迭代到第一种物品时,使用第一种物品填充背包,直到背包剩余空间小于第一种物品重量或者第一种物品无剩余时结束迭代。

算法设计

        使用f[i][v]表示从前i种物品中选取部分放入容量为v的背包的最大价值。则每种物品的n[i] + 1种状态分别表示为f[i - 1][v], f[i - 1][v - w[i]] + p[i],f[i - 1][v - 2 * w[i]] + 2 * p[i]…
        其中f[i][v]必然等于n[i] + 1种状态的最大值,即f[i][v] = max(f[i - 1][v], f[i - 1][v - w[i]] + p[i],f[i - 1][v - 2 * w[i]] + 2 * p[i]…),依次递归,知道i = 0,结束递归。第i种物品的i + 1中状态使用数组表示。

java代码

public class Page3 {    private static int w[] = {2, 3, 5, 1, 3, 2, 7, 4, 2, 6};//重量    private static int p[] = {4, 6, 7, 1, 4, 8, 3, 6, 2, 4};//价值    private static int n[] = {2, 3, 5, 1, 3, 1, 3, 2, 4, 5};//数量    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 == 0){            return (v / w[i] < n[i] ? v / w[i] : n[i]) * p[i];        }else{            int x = (v / w[i] < n[i] ? v / w[i] : n[i]) + 1;            int a[] = new int[x];            for(int j = 0; j < x; j++){                a[j] = fun(i - 1, v - j * w[i]) + j * p[i];            }            return max(a);        }           }    public static int max(int a[]){        int index = 0;        if(a.length == 0){            return -1;        }        for(int i = 0; i < a.length; i++){            if(a[i] > a[index]){                index = i;            }        }        return a[index];    }}

算法优化

        1.开始循环前可比较n[i] 与 v / w[i]的大小,将n[i] 置为两者最小是,减少复杂度;2.可以在比较浅按照权重进行排序;3.一定不要移除等重量低价值的物品,这一点不同于完全背包问题,移除后很可能影响结果。

2 0