学习数据结构和算法的日常Demo

背包问题

动态规划算法介绍

思路分析

解决类似的问题可以分解成一个个的小问题进行解决,假设存在背包容量大小分为1,2,3,4的各种容量的背包(分配容量的规则为最小重量的整数倍):

对于第一行(i=1), 目前只有吉他可以选择,所以

对于第二行(i=2),目前存在吉他和音响可以选择,所以


对于第三行(i=3),目前存在吉他和音响、电脑可以选择,所以

代码实现

public class 背包问题 {public static void main(String args[]) {int w[] = {1, 4, 3};               // 保存物品重量int val[] = {1500, 3000, 2000};   // 物品的价值int capacity = 4;                 // 背包容量int n = val.length;               // 物品个数// 二维数组,表// v[i][j]表示在前i个物品中能够放入容量为j的背包中的最大价值int[][] v = new int[n + 1][capacity + 1];// 记录放入商品的情况int[][] path = new int[n + 1][capacity + 1];// 初始化第一行,第一列for (int i = 0; i < v[0].length; i++) {v[0][i] = 0; // 第一行设置为0}for (int i = 0; i < v.length; i++) {v[i][0] = 0;    // 第一列设置为0}// 根据公式,算法.动态规划for (int i = 1; i < v.length; i++) {for (int j = 1; j < v[0].length; j++) {// 公式if (w[i - 1] > j) {v[i][j] = v[i - 1][j];} else {// 因为i从1开始// 因此需要:w[i-1],val[i-1]//v[i][j] = Math.max(v[i - 1][j], val[i - 1] + v[i - 1][j - w[i - 1]]);// 为了记录商品存放到背包的情况,不能直接使用上述公式if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) {v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];// 把当前情况记录到pathpath[i][j] = 1;} else {v[i][j] = v[i - 1][j];}}}}for (int[] ints : v) {for (int i : ints) {System.out.print(i + " ");}System.out.println();}System.out.println("取了哪些商品?");// 遍历最后的放入情况int i = path.length - 1;  // 行最大下标int j = path[0].length - 1;   // 列最大下标// 从最后开始找while (i > 0 && j > 0) {if (path[i][j] == 1) {System.out.printf("第%d个商品放入背包\n", i);j -= w[i - 1];  // 指向前一个放到背包的商品,-1是因为i比w大1}i--;}}
}

GitHub:数据结构和算法源代码

数据结构和算法(32)之背包问题相关推荐

  1. python【数据结构与算法】01背包问题(附例题)

    文章目录 1 定义 2 例题 3 压缩 1 定义 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包 ...

  2. python算法与数据结构-冒泡排序算法(32)

    阅读目录 一.冒泡排序介绍 二.冒泡排序原理 三.冒泡排序图解 四.冒泡排序总结 五.冒泡排序python代码实现 六.冒泡排序C语言代码实现 七.冒泡排序的优化 八.冒泡排序的时间复杂度 九.冒泡排 ...

  3. 数据结构与算法总结——背包问题与组和问题

    数据结构与算法总结--背包问题与组和问题 数据结构与算法总结--背包问题与组和问题 1. 背包问题 2.背包问题的变形 3. 组和问题 总结 数据结构与算法总结--背包问题与组和问题 我觉得学习算法很 ...

  4. Python天天美味(32) - python数据结构与算法之堆排序

    1. 选择排序 选择排序原理是先选出最小的数,与第一个数交换,然后从第二个数开始再选择最小的数与第二个数交换,-- def selection_sort(data):     for i in ran ...

  5. 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...

    一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...

  6. 数据结构背包问题c语言思路,【数据结构与算法】背包问题总结梳理

    背包问题总结分析 背包问题是个很经典的动态规划问题,本博客对背包问题及其常见变种的解法和思路进行总结分析 01背包 问题介绍 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件 ...

  7. 数据结构与算法之递归系列

    本文来自一个不甘平凡的码农 写在前边 几个月之前就想写这样一篇文章分享给大家,由于自己有心而力不足,没有把真正的学到的东西沉淀下来,所以一直在不断的在自学. 然后又用了一个星期的时间去整理.分类,才有 ...

  8. 《数据结构与算法之美》学习汇总

    此篇文章是对自己学习这门课程的一个总结和课后的一些练习,做一个汇总,希望对大家有帮助.本人是半路程序员,2018年2月开始学习C++的,下面的代码基本都是C++11版本的,代码有错误的地方请不吝留言赐 ...

  9. 数据结构与算法?看这篇就够了!!!

    程序 = 数据结构 + 算法 --图灵奖得主,计算机科学家N.Wirth(沃斯) 作为程序员,我们做机器学习也好,做Python开发也好,Java开发也好. 有一种对所有程序员无一例外的刚需 -- 算 ...

  10. 【算法】常见数据结构基本算法整理

    去年11月份听了牛客网的课,当时做了纸质的笔记整理. 现在为了以后方便查找,将问题目录整理如下. 每道题只提供解题思路,不贴源代码. 可能会稍微手写一下代码(没有在IDE上测,为了试下以后面试时手写代 ...

最新文章

  1. 微软:外接 USB 设备或 SD 卡时将无法更新 Windows 1903
  2. VirtualBox uuid冲突问题
  3. 如何自学python爬虫-怎样入门学习Python爬虫?
  4. 在Rancher 1.6上部署Traefik负载均衡器
  5. 实现物体绕不同轴旋转,并可以外部调用的函数
  6. LeetCode Reverse Vowels of a String
  7. (一) : iview-form 表单循环数组 - 验证规则
  8. js中一些常用的基本函数
  9. aws使用技巧_AWS:避免那些“神圣的法案”时刻的一些技巧
  10. 23为什么要帮助他人
  11. linux系统解锁用户百度,详细到没朋友,一文帮你理清Linux 用户与用户组关系~
  12. 在centos中如何用yum安装最新的yum源
  13. 淘宝/天猫/京东/拼多多/苏宁易购/小米商城/华为商城/抖音快手直播/茅台抢购助手,宝惠抢购助手/OK助手源码
  14. 『UE4数字孪生』开发流程浅析2022版(持续更新)
  15. 除了攀附名人、杜撰荣恩录,家谱造假中,还有这件事令人羞耻
  16. 继电器在交流应用时的zero-crossing
  17. linux运行同花顺,wine打不开同花顺软件
  18. JavaWebDay7
  19. Buct oj 1018
  20. 如何将本地项目上传至Gitee仓库(详细教程)

热门文章

  1. Yar服务端与客户端交互,请求原理
  2. php7 yar扩展,宝塔面板安装yar扩展
  3. 施努卡:机器视觉公司排名(机器人视觉系统)
  4. VAD检测原理及其过程
  5. R Shiny module学习笔记
  6. MT2712 USB
  7. Swift:一个简单的货币转换器App在iOS10中的分析和完善
  8. 公众号第三方平台开发 教程一 创建公众号第三方平台
  9. Storm-kafka【接口实现】4 - KafkaSpout
  10. 学会原谅自己,我们会更加强大