01 背包问题

  今天在算法课上讲解了动态规划算法,其中讲到了01背包问题。这是一种典型的动态规划问题,于是下课之后我使用java进行了相对应的代码实现。动态规划求解具有以下的性质:
1.最优子结构性质:最优解包含了其子问题的最优解,不是合并所有子问题的解,而是找最优的一条解线路,选择部分子最优解来达到最终的最优解。
2.子问题重叠性质:先计算子问题的解,再由子问题的解去构造问题的解(由于子问题存在重叠,把子问题解记录下来为下一步使用,这样就直接可以从备忘录中读取)。其中备忘录中先记录初始状态。

题目描述

现有一个容量大小为V的背包和N件物品,每件物品有两个属性,体积和价值,请问这个背包最多能装价值为多少的物品?

输入描述

第一行两个整数V和n。
接下来n行,每行两个整数体积和价值。1≤N≤1000,1≤V≤20000。
每件物品的体积和价值范围在[1,500]。

输出描述

输出背包最多能装的物品价值。

输入

6 3
3 5
2 4
4 2

输出

9

  首先我们来分析这个问题,它不同于背包问题的是一个物品只有放入背包和不放入背包两种状态,所以我们将这两种状态可以称之为01。这种问题一般是不能使用贪心算法进行解决的,我们通常使用动态规划的方法进行求解。因为这类问题具有最优子结构性质,也就是说整个问题的最优解一定包含了子问题的最优解,于是乎我们就可以在求解子问题的同时将解进行记录(备忘录的思想)从而降低整个问题求解的时间复杂度。
  依据输入样例我们可以对该问题进行分析,背包的容量为6,物品总共有3个。我们不妨记函数 V(i,j) 代表整个背包存放物品的价值,其中 i 表示第几个物品,j 表示背包的体积。记volume(i) 为第i个物品的体积,记value(i) 为第i个物品的价值。我们可以得到状态转移方程:
当volume(i) > j 时: V(i,j) = V(i-1,j) 此时背包放不下该物品
当volume(i) <= j 时: V(i,j) = max{V(i-1,j) , V(i-1,j-volume(i))+value(i)}
此时背包容量足够,在不放该物品 & 放该物品并不放上一个物品当中取最大值。
  我们可以用表格的形式来具体描述这个二维数组, 首先我们需要将数据初始化,也就是将第一行第一列赋值为0,因为无论是背包容量为0,还是物品为第0个(我们约定 i 从 1 开始)
当j=3 也就是背包容量为3时 volume(1)=j v(i,j)=max{0,5}

当i=2 j=5此时物品2 volume(1) < j v(i,j)=max{v(1,5),v(1,3)+4}

进一步完成表格

于是这个01背包问题也就转变成了一个二维数组的填数字问题,我们只需要按照状态方程去判断进行计算填满表格,就能够得到所背包的最大价值。

实现代码

import java.util.*;public class Main {
public static void main(String[] args) {Scanner sc = new Scanner(System.in);int v = sc.nextInt();//背包容量int n = sc.nextInt();//商品的个数Map<Integer,Map<Integer,Integer>> map = new HashMap<>();//容器用于存储商品键值对for(int i=0; i<n; i++){int key = i+1;HashMap<Integer,Integer> value = new HashMap<>();value.put(sc.nextInt(),sc.nextInt());map.put(key,value);}Integer max = findMax(map,v,n);System.out.println(max);
}
private static Integer findMax(Map<Integer, Map<Integer, Integer>> map, int v, int n) {//数据初始化int[][] arr = new int[n+1][v+1];for(int i=0;i<v+1;i++){arr[0][i]=0;}for(int i=0;i<n+1;i++){arr[i][0]=0;}int max = 0;//背包最大值int pack = v;//当前背包容量Set<Map.Entry<Integer, Map<Integer, Integer>>> entries = map.entrySet();for (Map.Entry<Integer, Map<Integer, Integer>> entry : entries) {int i = entry.getKey();//当前商品编号Map<Integer,Integer> Value =entry.getValue();//当前商品价值Set<Map.Entry<Integer, Integer>> entries1 = Value.entrySet();int tiji ;//当前商品体积int value;//当前商品价值for (Map.Entry<Integer, Integer> integerIntegerEntry : entries1) {tiji = integerIntegerEntry.getKey();value = integerIntegerEntry.getValue();for (int j = 1; j < v + 1; j++) {if (j < tiji) {arr[i][j] = arr[i - 1][j];} else {arr[i][j] = Math.max(arr[i - 1][j], arr[i - 1][j - tiji] + value);if (max <= arr[i][j]) {max = arr[i][j];}}}}}return  max;
}
}

动态规划DP——01背包问题相关推荐

  1. 经典动态规划:0-1 背包问题

    经典动态规划:0-1 背包问题 文章目录 经典动态规划:0-1 背包问题 一.题目描述 二.动规标准套路 三.题目描述 四.解法分析 五.优化 一.题目描述 就讨论最常说的 0-1 背包问题,简单描述 ...

  2. o-1背包问题迭代_经典动态规划:01背包问题的变体

    点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong   公众号:labuladong 若已授权白名单也必须保留以上来源信息 上篇文章 经典动态规划:0-1 背包问题 详解了通用的 ...

  3. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  4. 动态规划解决0-1背包问题详解(图文并茂)

    动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...

  5. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  6. 算法题解:动态规划解0-1背包问题

    概述 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问 ...

  7. c++ 多重背包状态转移方程_Python|动态规划关于0-1背包问题

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:算法与编程之美 前言 对学算法的同学来说,动态规划是其 ...

  8. 动态规划之01背包问题

    满篇都是干货,有详细的注释和代码,请放心观看. 这就是传说中的 01 背包问题,这个问题看到之后主要有两种思路: 一.贪心做法(错误想法) 这道题如果没有学过 01 背包问题的话,很容易想成一个贪心的 ...

  9. 力扣刷题-python-动态规划-1 (动态规划、01背包问题、完全背包问题)

    文章目录 1.动态规划 2.简单和中等题 3.01背包问题基础 4.01背包问题 5.完全背包 6.总结 1.动态规划 动态规划 是由前一个状态推导出 贪心算法 是直接取局部最优 动态规划需要直到状态 ...

最新文章

  1. 54. Leetcode 113. 路径总和 II (二叉树-二叉树路径和)
  2. 三维重建:闭环检测-相机闭环
  3. java泛型不是计算运行时的数据类型
  4. 导Excel数据到Oracle的脚本,Oracle使用TOAD实现导入导出Excel数据
  5. 裁剪平面ClipPlane
  6. html页面div等分,HTML5使用纯CSS实现“按比例平分”整个垂直空间
  7. php 调用永中云,永中优云:是时候给大家介绍真正的云端Office了
  8. php右下角弹窗代码,2019畅言最新去除隐藏右下角弹窗广告!代码添加彻底隐藏畅言右下角广告代码...
  9. Qt图像中心旋转的两种方法
  10. 使用原生js 监听video 当前播放时间和是否点击了播放或者暂停按钮
  11. onlyoffice 自动保存_onlyoffice服务在线编辑文档保存解析
  12. 学会这几个软件,你就可以获得次时代建模师称号!
  13. 常用表格:ASCAII码对照表
  14. 想学.Net,只要功夫深,铁柱磨成针
  15. win10+keras+yolo4训练自己的数据集
  16. php图片是啥,PHP图片操作
  17. Rtools 环境变量设置-windows
  18. 描写冬天的唯美诗句,你想知道的都在这里!
  19. OpenCV特征点检测------Surf(特征点篇)
  20. 自锁电路设计1.5V电压起

热门文章

  1. 七牛云图床php,PHP实现Markdown文章上传到七牛图床的实例内容
  2. (D)TLS1.3大揭秘之密码技术
  3. 如何让surface go变成数位板?
  4. 免费好用的IPv6之DDNS服务-Openwrt上dynv6的使用介绍
  5. SpringMVC限制上传文件大小
  6. nuc7 android tv,7代Intel NUC 7I7BNHL 接近完美黑苹果评测
  7. 7月VR大数据:Quest 2占比突破50%,Pico Neo 3较上月大幅涨幅
  8. 美团美食板块的token加密
  9. 有没有好的RFID仓库管理解决方案?RFID仓库管理系统就在新导智能
  10. 【java】---坦克大战