
AcWing 2. 01背包问题(背包DP)
发布日期:2021-05-07 14:08:47
浏览次数:19
分类:原创文章
本文共 2260 字,大约阅读时间需要 7 分钟。
有 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 51 22 43 44 5
输出样例:
8
思想:从集合的角度考虑dp问题
朴素写法:
import java.io.*;import java.lang.*;class Main{ static int n = 0, m = 0, N = 1010; static int[][] f = new int[N][N]; static int[] v = new int[N], w = new int[N]; public static void main(String[] args)throws Exception{ BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); String[] params = buf.readLine().split(" "); n = Integer.valueOf(params[0]); m = Integer.valueOf(params[1]); for(int i = 1; i <= n; ++i){ String[] info = buf.readLine().split(" "); v[i] = Integer.valueOf(info[0]); w[i] = Integer.valueOf(info[1]); } for(int i = 1; i <= n; ++i){ for(int j = 0; j <= m; ++j){ f[i][j] = f[i - 1][j]; if(v[i] <= j){ f[i][j] = Math.max(f[i][j], f[i - 1][j - v[i]] + w[i]); } } } System.out.print(f[n][m]); }}
优化写法:
import java.io.*;import java.lang.*;class Main{ static int n = 0, m = 0, N = 1010; static int[] f = new int[N]; static int[] v = new int[N], w = new int[N]; public static void main(String[] args)throws Exception{ BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); String[] params = buf.readLine().split(" "); n = Integer.valueOf(params[0]); m = Integer.valueOf(params[1]); for(int i = 1; i <= n; ++i){ String[] info = buf.readLine().split(" "); v[i] = Integer.valueOf(info[0]); w[i] = Integer.valueOf(info[1]); } for(int i = 1; i <= n; ++i){ for(int j = m; j >= v[i]; --j){ //因为当前坐标j大,所以更新操作使用的是j之前的更新它,是被上层计算的数据所更新 //如果j从v[i]开始,那么f数组j之后的数据是j之前的更新它,但是是被本层计算的数据所更新,不满足之前的公式含义 f[j] = Math.max(f[j], f[j - v[i]] + w[i]); } } System.out.print(f[m]); }}
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月04日 15时22分13秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Vue01常见指令,axios
2019-03-05
Vue路由嵌套刷新后页面没有重新渲染
2019-03-05
Vue使用bus进行组件间、父子路由间通信
2019-03-05
数据库三个级别封锁协议
2019-03-05
操作系统:缓冲技术的相关介绍
2019-03-05
函数与指针分析、回调函数
2019-03-05
新型类型转换
2019-03-05
类的实例
2019-03-05
Java中数据类型和运算符
2019-03-05
PAT 锤子剪刀布
2019-03-05
tomcat加载部署webapps目录下的项目
2019-03-05
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
2019-03-05
方法重写
2019-03-05
Threading Programming Guide(多线程编程指南)
2019-03-05
Swift--14类型扩展
2019-03-05
Socket通信原理和基础实践
2019-03-05
Java求逆波兰表达式的结果(栈)
2019-03-05
SDWebImage--http图片加载不出来的问题
2019-03-05
Application received signal SIGSEGV
2019-03-05
MySQL删除数据库时的错误(errno: 39)
2019-03-05