
AcWing 3. 完全背包问题 (完全背包dp)
发布日期:2021-05-07 14:08:47
浏览次数:22
分类:原创文章
本文共 3155 字,大约阅读时间需要 10 分钟。
有 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
输出样例:
10
思想:
暴力解法:
import java.io.*;import java.lang.*;class Main{ static int n = 0, m = 0, N = 1010; static int[] v = new int[N], w = new int[N]; static int[][] f = new int[N][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(" "); int a = Integer.valueOf(info[0]); int b = Integer.valueOf(info[1]); v[i] = a; w[i] = b; } for(int i = 1; i <= n; ++i){ for(int j = 0; j <= m; ++j){ for(int k = 0; k * v[i] <= j; ++k) f[i][j] = Math.max(f[i][j], f[i - 1][j - v[i] * k] + w[i] * k); } } System.out.print(f[n][m]); }}
朴素解法:
import java.io.*;import java.lang.*;class Main{ static int n = 0, m = 0, N = 1010; static int[] v = new int[N], w = new int[N]; static int[][] f = new int[N][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(" "); int a = Integer.valueOf(info[0]); int b = Integer.valueOf(info[1]); v[i] = a; w[i] = b; } 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][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[] v = new int[N], w = new int[N]; static int[] f = 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(" "); int a = Integer.valueOf(info[0]); int b = Integer.valueOf(info[1]); v[i] = a; w[i] = b; } for(int i = 1; i <= n; ++i){ for(int j = v[i]; j <= m; ++j){ f[j] = Math.max(f[j], f[j - v[i]] + w[i]); } } System.out.print(f[m]); }}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月09日 03时56分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Oracle 单行函数
2019-03-04
(Java 剑指 offer)剪绳子
2019-03-04
一篇文章带你搞定 OAuth 2.0 的四种方式
2019-03-04
一篇文章带你搞定 Spring Security 的登录流程
2019-03-04
一篇文章带你搞定官方推荐 Stack 的替代品 双端队列 Deque
2019-03-04
(LeetCode)Java 求解搜索旋转排序数组
2019-03-04
(模拟数组)Java 求解螺旋矩阵 II
2019-03-04
Burpsuite-02-设置JVM内存大小与解决页面显示文字乱码错误
2019-03-04
Python学习:字符串
2019-03-04
Python学习:继承
2019-03-04
Python学习:类、类对象和实例对象
2019-03-04
数据库系统概论:ER图设计
2019-03-04
AC自动机 - Word Puzzles - POJ - 1204
2019-03-04
DIJ - 昂贵的聘礼 - POJ 1062
2019-03-04
计算几何(旁切圆) - Ex-circles - UVA 11731
2019-03-04
DP - Tickets - HDU - 1260
2019-03-04