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

  • 相关阅读:
    基于 Javassist 和 Javaagent 实现动态切面
    基于SpringBoot搭建应用开发框架(二) —— 登录认证
    服务器集成环境搭建
    多租户个性化服务路由
    基于SpringBoot搭建应用开发框架(一) —— 基础架构
    Redis 学习(三) —— 事务、消息发布订阅
    Redis 学习(二) —— 数据类型及操作
    Redis 学习(一) —— 安装、通用key操作命令
    用FastDFS一步步搭建文件管理系统
    在Intellij IDEA中使用Debug
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5487222.html
Copyright © 2011-2022 走看看