博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多重背包问题II
阅读量:6181 次
发布时间:2019-06-21

本文共 2286 字,大约阅读时间需要 7 分钟。

多重背包问题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

转载地址:http://nebda.baihongyu.com/

你可能感兴趣的文章
JDK10 EA版特性速览
查看>>
超过254个IP,如何规划子网
查看>>
Amoeba新版本MYSQL读写分离配置
查看>>
制作XPE启动光盘的教程
查看>>
计算机网络基础
查看>>
一步步打造漂亮的新闻列表(无刷新分页、内容预览)(2)
查看>>
cron任务计划
查看>>
我也参加了唐骏一手推动的【2015年微创中国运动会】
查看>>
认证模式之SSL模式
查看>>
如何在 Linux 中统计一个进程的线程数
查看>>
NVIDIA新作解读:用GAN生成前所未有的高清图像(附PyTorch复现) | PaperDaily #15
查看>>
CString、CTime和COleDateTime转换
查看>>
在linux虚机中装vmtools
查看>>
WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
查看>>
linux设备驱动程序--类class的实现
查看>>
中国云计算应用进入集中爆发期
查看>>
算法精解---计数排序
查看>>
DockOne微信分享(一二八):容器如何监控?
查看>>
谈谈分布式事务(Distributed Transaction)[共5篇]
查看>>
如何确保快递“最后一公里” ,亚马逊打算送到你的汽车后备箱
查看>>