背包九讲之混合背包问题

背包九讲之混合背包问题

注意事项:

        混合背包的理解请建立在01背包与完全背包、多重背包的基础上。
        01背包:http://blog.csdn.net/u013054715/article/details/52402304
        完全背包:http://blog.csdn.net/u013054715/article/details/52403049
        多重背包:http://blog.csdn.net/u013054715/article/details/52403324

问题描述

        混合背包是01背包,完全背包,多重背包相互结合所产生的问题,即n种物品中,有的物品件数为1种,有的物品件数为有限数种,有的物品件数有无限数种,在这些物品中选取最优解(具体问题同01背包,此处不再详细,请参考前几篇文章)。

问题分析

        这个问题其实跟01背包、完全背包、多重背包同源,可以使用同一种解决办法,只要在解决问题的时候牢牢记住,无限量的物品实际上等同于背包总容量与单间物品的重量相处所得的件数(最大使用量),因为即使物品数量再多也不可能使用到超过最大使用量的部分,又考虑到件数为1的情况是有限量中的特殊情况,所以,这个问题万万全全可以转换为一个多重背包问题,进而又可以通过多重背包问题转换成01背包问题求解。

算法设计

        算法同多重背包基本相同,在此处不在细说,详细参考上一篇文章多重背包的详解,值得一提的是,在多重背包中,使用一个数组n表示物品可取的件数,其中n[i]表示第i件物品数量,在此时,因为有的物品无限量,所以在表示的时候可以使用一个极其大的数表示或者使用一个负数或者0表示,总之是一个不在区间[1,最大使用量]之间的数(此处建议使用负数或0),在递归迭代之前,先对数组n进行一次重新赋值,其中n[i]在区间[1, 最大使用量]之间的数保持不变,其他值赋值为最大使用量即可。

java代码

public class Page4 {
    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, -1, 5, -1, 3, -1, 3, 2, 4, 5};//数量
    private static int v = 5;
    public static void main(String[] args) {
        for(int i = 0; i < n.length; i++){
            if(n[i] == -1 || n[i] > v / w[i]){
                n[i] = v / w[i];
            }
        }
        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];
    }
}

算法优化

        混合背包的算法优化同多重背包相同,不再细说,混合背包的问题请参考多重背包。
        以上是我个人对混合背包的一些看法,如有不到之处,欢迎指正。
        未完待续。。。

你可能感兴趣的:(背包九讲,算法)