背包问题动态规划解法
一:题目:
背包问题
问题:两个数组 一个重量数组W 一个 价值数组 V 一个背包 bag ,返回不超过背包容量返回最大价值
二:暴力解法
思路:暴力遍历,思路就是递归的时候 按 选或者不选 当前 物品,如果,这样就会产生 w 数组个数次方个解,也就是所有解,遍历返回条件就是如果bag 减去当前物品的重量小于0 说明当前物品就放不进去了就停止循环,没个递归都有将当前物品放进去和不放进去两个解,选最大的向上返回,最后得到的就是最优解。
三:动态规划解法
比如到 第N个物品 ,这个时候因为上面物品拿或不拿就可能会出现N-1次方次尝试,如果尝试的参数一样(背包剩余空间一样,并且都是第N个物品),这个时候就不用重复计算,对已经计算的结果做缓存就可以,基于这个思想,只要循环 w的个数*背包存储空间 次 就可以得出结果
int[] weights = { 3, 2, 4, 7, 3, 1, 7 }; int[] values = { 5, 6, 3, 19, 12, 4, 2 }; int bag = 9;
1 最上面的一行代表背包剩余格子数
2 左边的代表 0到6个商品 总共7个
3 w 代表重量 v代表价值
开始推导
1 最下面一行 7 因为没有商品,所以最高价值都是0
2 倒数第二行6 物品重量是7 价值是 2 ,背包格子7之前,都不能放入背包,没有价值,7之后也只能放这一个物品
3 倒数第三行5 物品重量是1 价值是 4,当背包格子是1的时候就能装,装进去价值是4,在背包格子到8之前都能装6这个物品,当背包到8 ,装了5这个物品,还有7个背包空间,所以还能装6这个物品,价值则是2+4 = 6
4 倒数第四行 4 这个物品 也是按照逻辑做对比,其实上面都是按照这个逻辑的,只不过这里清晰写出来 ,首先判断当前背包容量是否能装 当前4这个物品,不能装价值就是0,能装也不能直接写0,还要看看5这个物品,当前背包容量的价值是多少,对比取最大。
5 按照这个计算策略,计算到最后 第一行最后一个 就是最优解27
代码
package 算法.动态规划.练习1;/*** 背包问题* 参数* w[] 重量* v[] 价值* 背包大小 int*/
public class bag {public static void main(String[] args) {//1 返回背包模拟参数int[] weights = {3, 2, 4, 7, 3, 1, 7};int[] values = {5, 6, 3, 19, 12, 4, 2};int bag = 9;System.out.println(maxValue(weights, values, bag));System.out.println(dp(weights, values, bag));//2}/*** 暴力解法* @param w* @param v* @param bag* @return*/private static int maxValue(int[] w, int[] v, int bag) {if (w == null || v == null || w.length != v.length||w.length==0) {return 0;}return process(w, v, 0, bag);}private static int process(int[] w, int[] v, int index, int bag) {if (index == w.length) {return 0;}//不放当前int p1 = process(w, v, index+1, bag);//获取当前 价值int p2 = 0;//如果拿了当前的 还有地方就继续拿,如果小于0 说明当前都放不进去if (bag-w[index] >= 0) {//就继续拿int next = process(w, v, index+1, bag-w[index]);p2 = next+v[index];}return Math.max(p1, p2);}//动态规划public static int dp(int[] w, int[] v, int bag) {if (w == null || v == null || w.length != v.length || w.length == 0) {return 0;}int N = w.length;int[][] dp = new int[N + 1][bag + 1];//从最下面一行开始for (int index = N - 1; index >= 0; index--) {//从左往右for (int rest = 0; rest <= bag; rest++) {//p1是不拿当前index的值 直接取下一个index rest背包大小情况下最大值int p1 = dp[index + 1][rest];int p2 = 0;//如果rest剩余背包容量 减去当前 index 的重量(判断是否能放入背包) 放不进去返回-1 如果能放进去就取dp 放进去之后对应的解int next = rest - w[index] < 0 ? -1 : dp[index + 1][rest - w[index]];//如果能放进去 就累加 放不进去 p2 就是 0 相当于取p1 不放进去的情况(因为放进去就无解了)if (next != -1) {p2 = v[index] + next;}//把当前index 剩余背包容量rest 放不放进去当前的最优解放到数组里,以后index-1取 index 就直接取结果dp[index][rest] = Math.max(p1, p2);}}for (int index = 0 ; index <= N ; index++) {//从左往右for (int rest = 0; rest <= bag; rest++) {System.out.print(dp[index][rest]+"|");}System.out.println(" ");}return dp[0][bag];}}
背包问题动态规划解法相关推荐
- 算法设计与分析 0-1背包问题 动态规划解法【超详细】
0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C. 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有 ...
- 0-1背包问题动态规划模型的Python解法
0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...
- 5. 最长回文子串——暴力法---动态规划解法---扩展中心法
暴力法 动态规划解法 class Solution {public String longestPalindrome(String s) {if (s == null) return null;cha ...
- leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)
题目 leetcode 64. 最小路径和 提示: m == grid.length n == grid[i].length 1 <= m, n <= 200 0 <= grid[i ...
- leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法
题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子 ...
- matlab多种分配方案_基于MATLAB的水资源优化分配问题动态规划解法
基于 MATLAB 的水资源优化分配问题动态规划解法 摘要:介绍了动态规划的基本原理,针对水资源分配问题进行了 动态规划方法分析.针对具体问题采用逆序解法的表格法进行了计 算,然后用 matlab 编 ...
- MDP动态规划解法(三)
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合
在我们使用递归算法时,可能会出现规模庞大的重复计算,用一个中间表记录每个计算过的最优解法,就可以避免大量的重复计算.中间结果记录可以很好解决找零兑换问题.实际上,这种方法还不能称为动态规划,而是叫做& ...
- 01背包问题 动态规划 java实现 简单通俗易懂
** 01背包问题 动态规划 ** 1.动态规划 什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案 ...
最新文章
- I.MX6 bq27441 driver hacking
- 【开源推荐】进阶实战,从一款音乐播放器开始
- 华为鸿蒙官方翻译_鸿蒙系统官方译名来了?华为在欧盟注册Harmony商标
- C/C++中Static和Const的作用
- [蓝桥杯][算法提高VIP]种树(dfs)
- android底部弹出显示不全,Android 解决 NestedScrollView 底部内容被遮挡显示不全
- 经典面试题(19):以下代码将输出的结果是什么?
- linux mysql多主一从_linux中mysql多主一从热备份
- 团队协助 开源项目_适合小团队的协作工具,良心开源项目管理工具
- Sparsity and Some Basics of L1 Regularization
- 华为HCIE之TS部分整理
- <EDEM 基础案例05>Screw Auger
- [ 笔记 ] 操作系统复习笔记
- vim insert VISUAL模式
- JDK 1.7 基本概念和目录结构
- 力扣解法汇总969-煎饼排序
- 针式打印机步进电机介绍
- 如何让微信公众号具备查询功能?试试这个方法
- matlab三天写论文!截面空间计量模型实战
- 计算机工业革命是,计算机工业革命是第几次科技革命