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];
        }
  • 相关阅读:
    个人关于浮动的理解
    css课堂笔记(盒子模型,标准文档流,浮动,美化)
    css和html课堂笔记
    html中的行内元素和块级元素
    css简介及常用语法
    html简介及常用功能
    权重比较
    盒模型
    css常见内联和块级元素
    Vigenère密码
  • 原文地址:https://www.cnblogs.com/theskulls/p/5487191.html
Copyright © 2011-2022 走看看