多重背包问题-----------Java

多重背包问题-----------Java

问题描述: 有M种物品和一个容量为N的背包。第m种物品最多有con_mum[i]件可用,每件价值是con_value[i],容量是con[i]。如何装载背包使得价值F(M,N)最大。

状态转移方程: F(M,N)=MAX(F(M-1,N),…,F(M-1,N-con[i]*j)+con_value[i]*j)

代码如下: 代码错误或者可优化之处请指正。

public int waysTo_MAX_VALUE(int n){
            int[] con={0,1,5,15,25};  //4种货物,假设使用0种货物其容量、数量、价值为0
            int[] con_value={0,1,6,20,34};
            int[] con_num={0,2,1,4,5};
            int[] dq=new int[n+1];
            int[] dq_n=new int[n+1];
            List<Integer> c=new ArrayList();
            int maxx=0;
            dq[0]=0;                //容量为0时价值为0
            dq_n[0]=con_num[0];
            for(int i=1;i<con.length;i++){
                for(int l=0;l<n;l++){
                    dq_n[l]=con_num[i];  //初始化 每种货物初始的使用个数
                }
                maxx+=con_num[i]*con_value[i]; //前i种货物最大容量
                for(int j=con[i];j<=n;j++) {
                    c.clear();
                    for (int k = 0; k <= j / con[i]; k++) {
                        if (k <= dq_n[j - con[i] * k]) {
                            c.add(dq[j - con[i] * k] + con_value[i] * k);
                        }
                    }
                    dq[j] = Collections.max(c);
                    dq_n[j] = dq_n[j - c.indexOf(Collections.max(c)) * con[i]] - c.indexOf(Collections.max(c));
                    if (j - maxx >0){   //当背包容量大于当前货物的最大容量时,剩余容量为多余容量,不用计算
                        dq[j]=dq[j-1];
                    }
                }
            }
            return dq[n];
        }

你可能感兴趣的:(多重背包问题-----------Java)