多重背包问题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
多重背包问题II的更多相关文章
- 5. 多重背包问题 II 【用二进制优化】
多重背包问题 II 描述 有 NN 种物品和一个容量是 VV 的背包. 第 ii 种物品最多有 sisi 件,每件体积是 vivi,价值是 wiwi. 求解将哪些物品装入背包,可使物品体积总和不超过背 ...
- AcWing 5. 多重背包问题 II
//二进制优化 最后变为01背包 #include <iostream> #include <algorithm> using namespace std; , M = ; i ...
- 4. 多重背包问题 I
多重背包问题 I 描述 有 NN 种物品和一个容量是 VV 的背包. 第 ii 种物品最多有 sisi 件,每件体积是 vivi,价值是 wiwi. 求解将哪些物品装入背包,可使物品体积总和不超过背包 ...
- 【动态规划】简单背包问题II
问题 B: [动态规划]简单背包问题II 时间限制: 1 Sec 内存限制: 64 MB提交: 21 解决: 14[提交][状态][讨论版] 题目描述 张琪曼:“为什么背包一定要完全装满呢?尽可能 ...
- 多重背包问题:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(HDU 2191)(二进制优化)
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 HDU 2191 一道裸的多重背包问题: #include<iostream> #include<algorithm> #i ...
- O(V*n)的多重背包问题
多重背包问题: 有n件物品,第i件价值为wi,质量为vi,有c1件,问,给定容量V,求获得的最大价值. 朴素做法: 视为0,1,2,...,k种物品的分组背包 [每组只能选一个] f[i][j]=Ma ...
- lintcode:背包问题II
背包问题II 给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大? 注意事项 A[i], V[i], n, m均为整数.你不能将物品进行切分.你所挑选的 ...
- 多重背包问题的两种O(M*N)解法
多重背包的题目很多,最著名的是poj1742楼教主的男人八题之一. poj1742:coins 有几种面值的钱币和每种的数量,问能够组成m以内的多少种钱数 这个题大家都归为多重背包问题,不过跟实际意义 ...
- 【动态规划/多重背包问题】POJ1014-Dividing
多重背包问题的优化版来做,详见之前的动态规划读书笔记. dp[i][j]表示前i中数加得到j时第i种数最多剩余几个(不能加和得到i的情况下为-1)递推式为: dp[i][j]=mi(dp[i-1][j ...
随机推荐
- 为什么学习Python
因为做iOS开发的,之前一直用OC,但是突然有一天苹果说出Swift,但是那时候的Swift真的是Bug多多,语法都不固定,所以只是大致看了看,而一年多之后,Swift已经发布2.0了,语言也相对稳定 ...
- UITableView表视图以及重建机制
表视图UITableView 表视图UITableView,是IOS中最重要的视图,随处可见 表视图通常用来管理一组具有相同数据结构的数据 UITableView继承自UIScrollView,所 ...
- Apple Watch应用开发经验谈:我遇到的那些坑
本文作者张忠良是滴答清单Apple Watch版应用的开发工程师,他用了一周的时间使用纯Objective-C语言完成了Apple Watch版滴答清单应用的开发工作.在这里,他从开发角度阐述了个人对 ...
- Memcached 在windows环境下安装
1.memcached简介 memcached是一个高性能的分布式内存对象缓存系统,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动应用的访问性 能.memcached基于 ...
- forword属性
forword属性 2013年7月8日 15:07 Name: Forward的名字,与mapping.findForward方法传入的值相同. Path: 请求转发的页面路径 Redirect: 请 ...
- unity工具IGamesTools之批量生成帧动画
unity工具IGamesTools批量生成帧动画,可批量的将指定文件夹下的帧动画图片自动生成对应的资源文件(Animation,AnimationController,Prefabs) unity工 ...
- WPF——数据绑定(二)绑定方法—绑定本地对象
注意:本人初学WPF,文中表达或技术性问题请勿见怪,欢迎指正,谢谢 标记拓展语法:绑定到本地对象 什么是绑定到本地对象,我个人理解就是实现UI层上两个或多个控件的相互关联,一个控件的状态改变,导致另一 ...
- 从C中变化过来的各种语言的printf输出格式
在c.php和shell中经常可以碰到printf的使用,特别是在php中printf的相关变种有好几个:print.printf.sprintf.vprintf.vsprintf 在这些语言 ...
- Node.js 学习(一) 安装配置
Windowv 上安装Node.js Windows 安装包(.msi) : 32 位安装包下载地址 : http://nodejs.org/dist/v0.10.26/node-v0.10.26-x ...
- Weblogic环境下hibernate、antlr类加载冲突问题分析及解决方案
公司应用项目在客户部署时经常遇到此类问题,为避免实施部署时增加配置量,花了点时间找到了此问题的终极解决办法(方案二.修改org.hibernate.hql.ast.HqlLexer的源代码).在此进行 ...