动态规划(dynamic programming)基础【背包问题】

川长思鸟来 2022-12-15 02:50 184阅读 0赞

目 录

哔哩哔哩网站——动态规划基础 背包问题(1) 01背包

哔哩哔哩网站——【动态规划】背包问题


百度百科——背包问题

哔哩哔哩网站——动态规划基础 背包问题(1) 01背包

视频网址——哔哩哔哩网站——动态规划基础 背包问题(1) 01背包

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 1

20201014204822515.png

20201014205127728.png 滚动数组

背包问题——优化算法——阶梯跳跃点

  1. // #include "everything.h"
  2. #include <bits/stdc++.h> // 错误代码
  3. using namespace std;
  4. int N, V, dp[1001][100001], c[100001], w[100001]; // c重量、w价值
  5. int main()
  6. {
  7. int i, j;
  8. cin >> N >> V;
  9. for (i = 1; i <= N; i++)
  10. cin >> c[i] >> w[i]; // 读入每个物品的重量与收益
  11. for (i = 1; i <= N; i++)
  12. {
  13. for (j = V; j >= 0; j--)
  14. {
  15. if (j < c[i])
  16. break;
  17. dp[j] = max(dp[j], dp[j - c[i]] + w[i]);
  18. }
  19. }
  20. cout << dp[V] << endl;
  21. system("pause");
  22. return 0;
  23. }

哔哩哔哩网站——【动态规划】背包问题

视频网址——哔哩哔哩网站——【动态规划】背包问题

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 3

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 4

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 5

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 6

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 7

回溯:没有与10相同的,所以物品4一定被装入背包了。背包空间为8,物体4体积为5,背包中剩余的空间“3”用来装其它物品。考虑背包容量为3的时候,最佳物品组合。—> 考虑3号物品到底有没有被装入背包 —> 若3号物品未被装入背包,考虑前两个物品装入背包的情况即可。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 8

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 9 watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 10

Java代码实现:https://www.cnblogs.com/jiyongjia/p/13475026.html

代码——原文链接

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 11

  1. package Z;
  2. import java.util.ArrayList;
  3. import java.util.LinkedHashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. public class Beibao {
  7. public static void main(String[] args) {
  8. Map<Integer, Integer> map = new LinkedHashMap<>();
  9. map.put(2, 3);
  10. map.put(3, 4);
  11. map.put(4, 5);
  12. map.put(5, 6);
  13. System.out.print("背包可容纳最大价值:" + getMaxValue(map, 8));
  14. }
  15. private static Integer getMaxValue(Map<Integer, Integer> gems, int capacity) {
  16. int[][] maxValue = new int[gems.size() + 1][capacity + 1];
  17. List<Integer> gemList = new ArrayList<>();
  18. int choose, notChoose;
  19. for (int i = 0; i < gems.size() + 1; i++) {
  20. maxValue[i][0] = 0;
  21. }
  22. for (int i = 0; i < capacity + 1; i++) {
  23. maxValue[0][i] = 0;
  24. }
  25. gemList.add(0);
  26. for (Integer gemKey : gems.keySet()) {
  27. gemList.add(gemKey);
  28. }
  29. for (int i = 1; i < gems.size() + 1; i++) {
  30. for (int j = 1; j < capacity + 1; j++) {
  31. if (gemList.get(i) > j) {
  32. maxValue[i][j] = maxValue[i - 1][j];
  33. } else {
  34. choose = gems.get(gemList.get(i)) + maxValue[i - 1][j - gemList.get(i)];
  35. notChoose = maxValue[i - 1][j];
  36. maxValue[i][j] = Math.max(choose, notChoose);
  37. }
  38. }
  39. }
  40. for (int i = 0; i < gems.size() + 1; i++) {
  41. for (int j = 0; j < capacity + 1; j++) {
  42. System.out.print(maxValue[i][j] + " ");
  43. }
  44. System.out.println();
  45. }
  46. getDetails(maxValue, gems, gemList, gems.size() + 1, capacity + 1);
  47. return maxValue[gems.size()][capacity];
  48. }
  49. private static void getDetails(int[][] maxValue, Map<Integer, Integer> gems,
  50. List<Integer> gemList, int rows, int cols) {
  51. List<Integer> details = new ArrayList<>();
  52. while (rows > 1 && cols > 1) {
  53. if (maxValue[rows - 1][cols - 1] != maxValue[rows - 2][cols - 1]) {
  54. details.add(rows - 1);
  55. rows--;
  56. cols = cols - 1 - gemList.get(rows - 1);
  57. } else {
  58. rows--;
  59. }
  60. }
  61. System.out.println("装入背包的有:");
  62. for (int i = 0; i < details.size(); i++) {
  63. System.out.println(
  64. "体积为" + gemList.get(details.get(i)) + ",价值为" + gems.get(gemList.get(details.get(i))) + "的石头");
  65. }
  66. }
  67. }

多谢观看、

发表评论

表情:
评论列表 (有 0 条评论,184人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态规划Dynamic Programming

    首先以LeetCode上面的一个问题来开始动态规划的讲解: 题目描述:你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的

    相关 算法-动态规划 Dynamic Programming

    今天在leetcode刷题的时候,遇到动态规划类型的题目,想更加深入的了解下,就从网上搜了搜,发现博主的这篇文章讲解的很详细,因此分享下,希望给大家都带来帮助。 转载自:[h

    相关 动态规划 背包问题

    [本篇博文参考此博文,该博文PPT非常有助理解][PPT] > 问题描述: > 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背