zoukankan      html  css  js  c++  java
  • 多重背包问题

    多重背包问题
     总体积是m,每个小物品的体积是A[i] ,每个小物品的数量是B[i]

    求能够放入背包内的最大物品的体积

    解题

    和01背包问题很类似

    状态转移方程

    不放A[i]

    f[i][j] =f[i-1][j]

    放A[j]

    可放多个设为k,

    k = min(j/A[i],B[i])

    f[i][j] = f[i-1][j- ki*A[i]] + ki*A[i]  0<=ki<=k  取最大值

     完全背包问题0<=ki*A[i]<=m

    public class Solution {
        /**
         * 多重背包问题
         * 总体积是m,每个小物品的体积是A[i] ,每个小物品的数量是B[i]
         * 
         * @param m: An integer m denotes the size of a backpack
         * @param A: Given n items with size A[i] 0 开始的 A是
         * @return: The maximum size
         */
        public int backPack(int m, int[] A,int[] B ) {
            // write your code here
            int[][] P = new int[A.length+1][m+1];// P[i][j] 前i个物品放在j的空间中的最大价值
            for(int i = 0;i< A.length; i++){
                for(int j = m;j>=1;j--){
                    if(j>=A[i]){
                        int k = j/A[i];// 该物品最大可以放k个,然而限制条件最大是B[i]
                        k = Math.min(k,B[i]);// 取最小值
                        while(k>=0){
                            if(j>=A[i]*k){
                                P[i+1][j] =Math.max(P[i+1][j], P[i][j-k*A[i]] + k*A[i]);
                            }
                            k--;
                        }
                    }
                        
                    else
                        P[i+1][j] = Math.max(P[i][j],P[i+1][j]);
                }
            }
            return P[A.length][m];
        }
        public static void main(String[] args){
            int m = 10;//100;
            int[] A=new int[]{1,2,3,4};
            int[] B=new int[]{2,3,1,4};
            int sum = new Solution().backPack(m, A,B);
            System.out.println(sum);
        }
    }

    转换成一维数组

        public int backPack(int m, int[] A,int[] B ) {
            // write your code here
            int[] P = new int[m+1];// P[j] j的空间中的最大价值
            for(int i = 0;i< A.length; i++){
                for(int j = m;j>=1;j--){
                    if(j>=A[i]){
                        int k = j/A[i];// 该物品最大可以放k个,然而限制条件最大是B[i]
                        k = Math.min(k,B[i]);// 取最小值
                        while(k>=0){
                            if(j>=A[i]*k){
                                P[j] =Math.max(P[j], P[j-k*A[i]] + k*A[i]);
                            }
                            k--;
                        }
                    }
                        
                    else
                        P[j] = Math.max(P[j],P[j]);
                }
            }
            return P[m];
        }
  • 相关阅读:
    Python 生成器相关知识
    openpyxl 模块学习记录
    Python 装饰器相关知识
    Python 闭包的相关知识
    Python 内置函数简单介绍
    Git提交的本地仓库在什么位置
    支付宝公钥,私钥加密解密问题
    字符转义
    pyhton 模拟浏览器实现
    大小端模式 大端存储 小端存储
  • 原文地址:https://www.cnblogs.com/theskulls/p/5487191.html
Copyright © 2011-2022 走看看