lintcode:背包问题II
给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?
注意事项
A[i], V[i], n, m均为整数。你不能将物品进行切分。你所挑选的物品总体积需要小于等于给定的m。
对于物品体积[2, 3, 5, 7]和对应的价值[1, 5, 2, 4], 假设背包大小为10的话,最大能够装入的价值为9。
解题
动态规划,和上一题很类似的
状态转移方程:
f[i][j]表示前i个商品在j的空间时候能够获得最大的价值
状态转移方程:
不放第i个商品
f[i][j] = f[i-1][j]
放第i个商品
f[i][j] = f[i-1][j-A[i]]+V[i]
public class Solution {
/**
* @param m: An integer m denotes the size of a backpack
* @param A & V: Given n items with size A[i] and value V[i]
* @return: The maximum value
*/
public int backPackII(int m, int[] A, int V[]) {
// write your code here
int[][] P = new int[A.length+1][m+1];
for(int i=1;i<=A.length;i++){
for(int j=m;j>=0;j--){
if(j>=A[i-1])
P[i][j] = P[i-1][j-A[i-1]] + V[i-1];// 放第 i-1个物品,i-1最小值是0开始
P[i][j] = Math.max(P[i][j],P[i-1][j]);// 不放
}
}
return P[A.length][m];
}
}
改成一维数组
public class Solution {
/**
* @param m: An integer m denotes the size of a backpack
* @param A & V: Given n items with size A[i] and value V[i]
* @return: The maximum value
*/
public int backPackII(int m, int[] A, int V[]) {
// write your code here
int[] P = new int[m+1];
for(int i=1;i<=A.length;i++){
for(int j=m;j>=0;j--){
if(j>=A[i-1])
P[j] = Math.max(P[j],P[j-A[i-1]] + V[i-1]);
}
}
return P[m];
}
}
lintcode:背包问题II的更多相关文章
- 【动态规划】简单背包问题II
问题 B: [动态规划]简单背包问题II 时间限制: 1 Sec 内存限制: 64 MB提交: 21 解决: 14[提交][状态][讨论版] 题目描述 张琪曼:“为什么背包一定要完全装满呢?尽可能 ...
- 多重背包问题II
多重背包问题II 总体积是m,每个小物品的体积是A[i] ,每个小物品的数量是B[i],每个小物品的价值是C[i] 求能够放入背包内的最大物品能够获得的最大价值 和上一个很类似 上一题体积就是价值,这 ...
- 5. 多重背包问题 II 【用二进制优化】
多重背包问题 II 描述 有 NN 种物品和一个容量是 VV 的背包. 第 ii 种物品最多有 sisi 件,每件体积是 vivi,价值是 wiwi. 求解将哪些物品装入背包,可使物品体积总和不超过背 ...
- [LintCode] Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- AcWing 5. 多重背包问题 II
//二进制优化 最后变为01背包 #include <iostream> #include <algorithm> using namespace std; , M = ; i ...
- lintcode算法周竞赛
------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...
- 7九章算法强化班全解--------Hadoop跃爷Spark
------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...
- [算法专题] 深度优先搜索&回溯剪枝
1. Palindrome Partitioning https://leetcode.com/problems/palindrome-partitioning/ Given a string s, ...
- 动态规划算法模板和demo
366. 斐波纳契数列 中文 English 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列 ...
随机推荐
- OC中NSDictionary(字典)、NSMutableDictionary(可变字典)、NSSet(集合)、NSMutableSet(可变集合)得常用方法
字典用于保存具有映射关系数据的集合 一个key—value对认为是一个条目(entry),字典是存储key—value对的容器 与数组不同,字典靠key存取元素 key不能重复,value必须是对象 ...
- QT中实现中文的显示与国际化
1 增加头文件 #include "QTextCodec" 2 在文件中增加如下内容 QTextCodec::setCodecForTr(QTextCodec::codecF ...
- DXP中原理图与PCB图元件互找
在原理图中找到元件,快捷键TS即可在PCB中找到元件,且为选中状态.
- 微软职位内部推荐-Software Engineer II-SDP
微软近期Open的职位: Position: SDE II The R&D of Shared Data Platform at Application and Services Group ...
- PSP0表格
一 项目计划日志 周活动总结表 姓名:陆宇 日期:3.1 ...
- MFC源码不能设置断点调试
用VS2013中MFC开发应用程序时,进入MFC源码设置断点调试.但是在调试过程中发现无法进入源码.最后发现在MFC设置的MFC的使用默认值是在共享dll中使用MFC,这就意味着MFC中的源码并没有连 ...
- java并发编程:进程和线程
java并发编程涉及到很多内容,当然也包括多线程,再次补充点相关概念 原文地址:http://www.cnblogs.com/dolphin0520/p/3910667.html 一.操作系统中为什么 ...
- 三、freemarker数据、模版指令
数据类型 1. 直接指定值(字符串.数值.布尔值.集合.Map对象) 2. 字符串:直接指定字符串使用单引号.双引号,字符中间可以使用转义符“\”,如果字符内有大量特殊 ...
- 【Subsets II】cpp
题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...
- 【Search Insert Position 】cpp
题目: Given a sorted array and a target value, return the index if the target is found. If not, return ...