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

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

    求能够放入背包内的最大物品能够获得的最大价值

    和上一个很类似

    上一题体积就是价值,这里的价值是单独定义了

    状态转移方程

    不放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*C[i] 0<=ki<=k 取最大值

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

    public class Solution {
        public int backPack(int m, int[] A,int[] B ,int[] C) {
            // write your code here
            int[] P = new int[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[j] =Math.max(P[j], P[j-k*A[i]] + k*C[i]);
                            }
                            k--;
                        }
                    }
                        
                    else
                        P[j] = Math.max(P[j],P[j]);
                }
            }
            return P[m];
        }
        /**
         * 多重背包问题
         * 总体积是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 backPack1(int m, int[] A,int[] B ,int[] C) {
            // 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*C[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[] C=new int[]{2,13,4,2};
            int sum = new Solution().backPack(m, A,B,C);
            System.out.println(sum);
        }
    }

    10:45

    100:55

  • 相关阅读:
    Android UI ActionBar功能-ActionBarProvider的使用
    Android UI ActionBar功能-自动隐藏 Action Bar
    Android UI ActionBar功能-Action Bar 左上角的向上或返回按钮
    Android UI ActionBar功能-自定义Tab功能
    Android UI ActionBar功能-自定义 Action Bar 样式
    Android UI ActionBar功能-在 Action Bar 上添加按钮
    Android UI ActionBar功能-启动ActionBar
    AndroidUI 侧滑菜单 DrawerLayout的使用
    AndroidUI 引导页面的使用
    AndroidUI 布局动画-点九PNG技术
  • 原文地址:https://www.cnblogs.com/theskulls/p/5487222.html
Copyright © 2011-2022 走看看