一:题目:

背包问题

问题:两个数组 一个重量数组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];}}

背包问题动态规划解法相关推荐

  1. 算法设计与分析 0-1背包问题 动态规划解法【超详细】

    0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C. 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有 ...

  2. 0-1背包问题动态规划模型的Python解法

    0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...

  3. 5. 最长回文子串——暴力法---动态规划解法---扩展中心法

    暴力法 动态规划解法 class Solution {public String longestPalindrome(String s) {if (s == null) return null;cha ...

  4. leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)

    题目 leetcode 64. 最小路径和 提示: m == grid.length n == grid[i].length 1 <= m, n <= 200 0 <= grid[i ...

  5. leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法

    题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子 ...

  6. matlab多种分配方案_基于MATLAB的水资源优化分配问题动态规划解法

    基于 MATLAB 的水资源优化分配问题动态规划解法 摘要:介绍了动态规划的基本原理,针对水资源分配问题进行了 动态规划方法分析.针对具体问题采用逆序解法的表格法进行了计 算,然后用 matlab 编 ...

  7. MDP动态规划解法(三)

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  8. Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合

    在我们使用递归算法时,可能会出现规模庞大的重复计算,用一个中间表记录每个计算过的最优解法,就可以避免大量的重复计算.中间结果记录可以很好解决找零兑换问题.实际上,这种方法还不能称为动态规划,而是叫做& ...

  9. 01背包问题 动态规划 java实现 简单通俗易懂

    ** 01背包问题 动态规划 ** 1.动态规划 什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案 ...

最新文章

  1. I.MX6 bq27441 driver hacking
  2. 【开源推荐】进阶实战,从一款音乐播放器开始
  3. 华为鸿蒙官方翻译_鸿蒙系统官方译名来了?华为在欧盟注册Harmony商标
  4. C/C++中Static和Const的作用
  5. [蓝桥杯][算法提高VIP]种树(dfs)
  6. android底部弹出显示不全,Android 解决 NestedScrollView 底部内容被遮挡显示不全
  7. 经典面试题(19):以下代码将输出的结果是什么?
  8. linux mysql多主一从_linux中mysql多主一从热备份
  9. 团队协助 开源项目_适合小团队的协作工具,良心开源项目管理工具
  10. Sparsity and Some Basics of L1 Regularization
  11. 华为HCIE之TS部分整理
  12. <EDEM 基础案例05>Screw Auger
  13. [ 笔记 ] 操作系统复习笔记
  14. vim insert VISUAL模式
  15. JDK 1.7 基本概念和目录结构
  16. 力扣解法汇总969-煎饼排序
  17. 针式打印机步进电机介绍
  18. 如何让微信公众号具备查询功能?试试这个方法
  19. matlab三天写论文!截面空间计量模型实战
  20. 计算机工业革命是,计算机工业革命是第几次科技革命

热门文章

  1. 如何使用密码管理器-Enpass管理个人密码(macos、win10、Android亲测)
  2. 腾讯云开团!2018年6月份最新福利,360元买4年,赶紧开撸
  3. HDU 6162 Ch’s gift
  4. 一些比较早的Javascript作品
  5. PL/SQL Developer下载安装及使用
  6. JS设置定时器和清除定时器
  7. Python selenium自动化测试框架入门--登录测试实例
  8. 狼叔:Node全栈为前端带来更多可能
  9. 线索二叉树 —C语言王道
  10. Java代码编写猜拳小游戏