
完全背包问题的动态规划解法(普通的思路)
初始化 遍历每个物品和每个可能的重量,尝试不同的重量组合,更新 在每次循环中,计算当前物品的不同倍数对总价值的贡献,更新 输入处理:读取输入数据,包括物品的数量、重量、价值和背包容量。 初始化 动态规划数组填充:对于每个物品和每个可能的重量,计算当前物品的不同倍数对总价值的贡献,并更新 结果输出:返回背包容量为
发布日期:2021-05-07 22:01:53
浏览次数:25
分类:精选文章
本文共 2029 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到一种方法来选择物品,使得总价值最大化,同时总重量不超过背包容量。这个问题属于完全背包问题,因为物品可以无限重复使用。
方法思路
我们可以使用动态规划来解决这个问题。动态规划的核心思想是通过构建一个二维数组 dp
,其中 dp[i][j]
表示前 i
个物品,总重量为 j
时的最大价值。通过逐个考虑每个物品,并尝试不同的重量组合,我们可以填充这个二维数组,最终得到结果。
具体步骤如下:
dp
数组。dp[0][i]
表示仅使用第一个物品时,重量为 i
的最大价值。dp
数组。dp
数组中的最大值。解决代码
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int w[] = new int[n]; int v[] = new int[n]; for (int i = 0; i < n; i++) { w[i] = sc.nextInt(); } for (int i = 0; i < n; i++) { v[i] = sc.nextInt(); } int W = sc.nextInt(); int res = solution(w, v, n, W); System.out.println(res); sc.close(); } private static int solution(int[] w, int[] v, int n, int W) { int[][] dp = new int[n][W + 1]; // 初始化第一个物品 int firstW = w[0]; int firstV = v[0]; for (int j = 0; j <= W; j++) { int k = j / firstW; dp[0][j] = k * firstV; } // 初始化其他物品为0 for (int i = 0; i < n; i++) { dp[i][0] = 0; } // 遍历每个物品 for (int i = 1; i < n; i++) { for (int j = 1; j <= W; j++) { int maxVal = 0; int k = 1; while (true) { int currentW = k * w[i]; if (currentW > j) { break; } int currentV = k * v[i] + dp[i-1][j - currentW]; if (currentV > maxVal) { maxVal = currentV; } k++; } dp[i][j] = maxVal; } } return dp[n-1][W]; }}
代码解释
dp
数组:第一个物品的每个可能重量对应的最大价值被初始化。dp
数组中的最大值。W
时的最大价值。通过这种方法,我们可以高效地解决完全背包问题,确保在时间复杂度合理的范围内得到最优解。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月17日 17时48分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
11.2.6 时间值的小数秒
2019-03-05
Redis源码分析(七)--- zipmap压缩图
2019-03-05
【MySQL】(九)触发器
2019-03-05
Oracle 11G环境配置
2019-03-05
【Python】(十二)IO 文件处理
2019-03-05
【Oozie】(三)Oozie 使用实战教学,带你快速上手!
2019-03-05
师兄面试遇到这条 SQL 数据分析题,差点含泪而归!
2019-03-05
C语言的数值溢出问题(上)
2019-03-05
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
2019-03-05
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
2019-03-05
android:使用audiotrack 类播放wav文件
2019-03-05
聊聊我的五一小假期
2019-03-05
数据库三个级别封锁协议
2019-03-05
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
2019-03-05
ubuntu学习笔记-常用文件、命令以及作用(hosts、vim、ssh)
2019-03-05
SLAM学习笔记-求解视觉SLAM问题
2019-03-05
程序员应该知道的97件事
2019-03-05
create-react-app路由的实现原理
2019-03-05