AcWing--2.01背包问题
有 NN 件物品和一个容量是 VV 的背包。每件物品只能使用一次。
第 ii 件物品的体积是 vivi,价值是 wiwi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,VN,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 NN 行,每行两个整数 vi,wivi,wi,用空格隔开,分别表示第 ii 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤10000<N,V≤1000
0<vi,wi≤10000<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8
思路:
f[i][j]:表示所有选法集合中,只从前i个物品中选,并且总体积比j小的选法的集合,它的值是这个集合中每一个选法的最大值.
状态转移方程
f[i][j] = max(f[i-1][j], f[i-1][j-v[i]]+w[i])
f[i-1][j]:不选第i个物品的集合中的最大值
f[i-1][j-v[i]]+w[i]:选第i个物品的集合,但是直接求不容易求所在集合的属性,先将第i个物品的体积减去,求剩下集合中选法的最大值.
问题,例如选择物品的体积为3,那么他的上一个就得是f[i-1][j-3],加上他之后就是f[i][j]
集合如何划分
一般原则:不重不漏,不重不一定都要满足(一般求个数时要满足)
如何将现有的集合划分为更小的子集,使得所有子集都可以计算出来。
import java.util.Scanner;
public class Solution2 {
public static void main(String[] args)
{
int m,n;
Scanner sc = new Scanner(System.in);
m = sc.nextInt();//物品数量
n = sc.nextInt();//背包容量
int i,j;
int dp[][] = new int[m+1][n+1];
dp[0][0]=0;
int weight[] = new int[m+1];
int value[] = new int[m+1];
for(i=1;i<=m;i++)
{
weight[i] = sc.nextInt();
value[i] = sc.nextInt();
}
for(i=1;i<=m;i++)
{
for(j=0;j<=n;j++)
{
dp[i][j] = dp[i-1][j];//不选第i个
if(j>=weight[i])
{
dp[i][j]=Math.max(dp[i][j], dp[i-1][j-weight[i]]+value[i]);
}
}
}
int max = 0;
for(i=0;i<=n;i++)
{
max = Math.max(max, dp[m][i]);
}
System.out.println(max);
}
}
优化后的代码:dp只与前面那一行有关,与列无关,所以可以使用一维数组
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
int m,n;
Scanner sc = new Scanner(System.in);
m = sc.nextInt();//物品数量
n = sc.nextInt();//背包容量
int i,j;
int dp[] = new int[n+1];
int weight[] = new int[m+1];
int value[] = new int[m+1];
for(i=1;i<=m;i++)
{
weight[i] = sc.nextInt();
value[i] = sc.nextInt();
}
for(i=1;i<=m;i++)
{
for(j=n;j>=weight[i];j--) //从大到小枚举是因为,如果写成从小到大,那相当于是
//dp[i][j]=Math.max(dp[i][j], dp[i][j-weight[i]]+value[i]),
//例如:第一个物体体积为3,dp[3]=3,dp[6]=6,选取了两次,i=1时,dp[3~n]都应该是3,因为此时物体只有一个
{
dp[j]=Math.max(dp[j], dp[j-weight[i]]+value[i]);
}
}
int max = 0;
for(i=0;i<=n;i++)
{
max = Math.max(max, dp[i]);
}
System.out.println(max);
}
}
AcWing--2.01背包问题相关推荐
- 【AcWing】AcWing 2. 01背包问题
目录 一.题目 1.原题链接 2.题目描述 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 一.题目 1.原题链接 2. 01背包问题 - AcWing题库 2.题目描述 有 N 件物品和一 ...
- ACwing 2. 01背包问题(DP)
文章目录 1. 题目 2. 解题 1. 题目 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积 ...
- AcWing 2. 01背包问题(01背包模板)
题目链接 https://www.acwing.com/problem/content/2/ 思路 对于每一个物品我们能做一个选择,选上它(前提是当前的剩余背包容量够),或者不选,那么我们只需要在这其 ...
- acwing 2. 01背包问题
有 N 件物品和一个容量是 V的背包.每件物品只能使用一次.第 i件物品的体积是 vi,价值是 wi.求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且价值最大.输出最大价值. 输入格式 ...
- 九种 0-1 背包问题详解
目录 动态规划概念 问题1:0-1背包问题 问题2:完全背包问题 问题3:多重背包问题 问题4:混合背包问题 问题5:二维背包问题 问题6:分组背包问题 问题7:有依赖的背包问题 (困难) 问题8:背 ...
- ACwing 3. 完全背包问题(DP)
文章目录 1. 题目 2. 解题 1. 题目 有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用. 第 i 种物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体 ...
- 0-1背包问题python实现
0-1背包问题 ACWings题目链接:https://www.acwing.com/problem/content/2/ 不会的小伙伴可以看一下视频:https://www.bilibili.com ...
- 动态规划:01背包问题
一.什么是01背包问题? 举个例子,你要去一个水果摊拿水果,每种水果都有对应的两种属性:占用的体积V和蕴含的价值W.而你的背包体积为N.老板说:每种水果只能拿一个!因此对于咱们肯定得想一种搭配方式使得 ...
- 19185 01背包问题
19185 01背包问题 题目 题解 一维dp优化代码 题目 Description 一个旅行者有一个最多能装 M公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,-,. 它们的价值分别为C1 ...
- 第一章 动态规划 背包问题之01背包问题
背包问题题谱 1.基础01背包问题 1. 问题描述 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次.第 i 件物品的体积是 vi,价值是 wi.求解将哪些物品装入背包,可使这些物品的总体 ...
最新文章
- mysql int char连接_MySQL中int、char以及varchar的性能比较
- 最初的梦想,将来的你一定会感谢现在努力的自己
- UVA10382喷水装置
- Git远程推送和抓取分支
- Android--intent详解
- 7种进阶方法让你快速测试端口连通性
- 数据级并行--计算机体系结构
- getLong java_java.lang.Long.getLong()方法实例
- 服务器 mysql iis 内存_windows服务器iis配置php和mysql环境图文教程
- 十五的学习日记20160926-你不知道的JS笔记/
- matlab计算均值和方差
- Android车牌识别sdk开发包,基于Android和iOS平台的车牌识别SDK开发包
- openpyxl给excel设置条件格式
- PHP+MySQL实现留言板功能(一)
- LNOI2022 退役记
- Verilog中寄存器和储存器的建模
- [创业之路-45] :复盘与自省 - 创业公司如何设定股权退出机制?
- queue.queue是什么
- 7-18 二分法求多项式单根
- 我的世界mod开发(5)做一把无敌的剑
热门文章
- LeetCode 6. Z 字形变换(找规律)
- LeetCode 第 21 场双周赛(779/1913,前40.7%)
- LeetCode 816. 模糊坐标
- java jdbc操作类_Java-编写一个jdbc操作类
- 传智播客java测试题_传智播客Java基础综合测试题
- Codeforces Round #702 (Div. 3)解题报告
- java流的传递方式是_java中数据的传递方式到底是怎样的!
- matlab记录路径,matlab对文件目录路径的操作
- python3.6是用来干嘛的_学 Python 都用来干嘛的?
- Spring Boot中使用Spring Security进行安全控制