动态规划的用法——01背包问题

问题主题:著名的01背包问题

问题描述:

有n个重量和价值分别为wi、vi的物品,现在要从这些物品中选出总重量不超过W的物品,求所有挑选方案中的价值最大值。

限制条件:

1<=N<=100

1<=wi 、vi<=100

1<=wi<=10000

样例:

输入

N=4

W[N] = {2, 1, 3, 2}

V[N] = {3, 2, 4, 2}

输出

W = 5(选择0,1,3号)

【解法一】

解题分析:

用普通的递归方法,对每个物品是否放入背包进行搜索

程序实现:

C++

[cpp] view plaincopyprint?
  1. #include <stdio.h>
  2. #include <tchar.h>
  3. #include <queue>
  4. #include "iostream"
  5. using namespace std;
  6. const int N = 4;
  7. const int W = 5;
  8. int weight[N] = {2, 1, 3, 2};
  9. int value[N] = {3, 2, 4, 2};
  10. int solve(int i, int residue)
  11. {
  12. int result = 0;
  13. if(i >= N)
  14. return result;
  15. if(weight[i] > residue)
  16. result = solve(i+1, residue);
  17. else
  18. {
  19. result = max(solve(i+1, residue), solve(i+1, residue-weight[i]) + value[i]);
  20. }
  21. }
  22. int main() {
  23. int result = solve(0, W);
  24. cout << result << endl;
  25. return 0;
  26. }

 

【解法二】

解题分析:

用记录结果再利用的动态规划的方法,上面用递归的方法有很多重复的计算,效率不高。我们可以记录每一次的计算结果,下次要用时再直接去取,以提高效率

程序实现:

C++

[cpp] view plaincopyprint?
  1. #include <stdio.h>
  2. #include <tchar.h>
  3. #include <queue>
  4. #include "iostream"
  5. using namespace std;
  6. const int N = 4;
  7. const int W = 5;
  8. int weight[N] = {2, 1, 3, 2};
  9. int value[N] = {3, 2, 4, 2};
  10. int record[N][W];
  11. void init()
  12. {
  13. for(int i = 0; i < N; i ++)
  14. {
  15. for(int j = 0; j < W; j ++)
  16. {
  17. record[i][j] = -1;
  18. }
  19. }
  20. }
  21. int solve(int i, int residue)
  22. {
  23. if(-1 != record[i][residue])
  24. return record[i][residue];
  25. int result = 0;
  26. if(i >= N)
  27. return result;
  28. if(weight[i] > residue)
  29. {
  30. record[i + 1][residue] = solve(i+1, residue);
  31. }
  32. else
  33. {
  34. result = max(solve(i+1, residue), solve(i+1, residue-weight[i]) + value[i]);
  35. }
  36. return record[i + 1][residue] = result;
  37. }
  38. int main() {
  39. init();
  40. int result = solve(0, W);
  41. cout << result << endl;
  42. return 0;
  43. }

Java

[java] view plaincopyprint?
  1. package greed;
  2. /**
  3. * User: luoweifu
  4. * Date: 14-1-21
  5. * Time: 下午5:13
  6. */
  7. public class Knapsack {
  8. private int maxWeight;
  9. private int[][] record;
  10. private Stuff[] stuffs;
  11. public Knapsack(Stuff[] stuffs, int maxWeight) {
  12. this.stuffs = stuffs;
  13. this.maxWeight = maxWeight;
  14. int n = stuffs.length + 1;
  15. int m = maxWeight+1;
  16. record = new int[n][m];
  17. for(int i = 0; i < n; i ++) {
  18. for(int j = 0; j < m; j ++) {
  19. record[i][j] = -1;
  20. }
  21. }
  22. }
  23. public int solve(int i, int residue) {
  24. if(record[i][residue] > 0) {
  25. return record[i][residue];
  26. }
  27. int result;
  28. if(i >= stuffs.length) {
  29. return 0;
  30. }
  31. if(stuffs[i].getWeight() > residue) {
  32. result = solve(i + 1, residue);
  33. } else {
  34. result = Math.max(solve(i + 1, residue),
  35. solve(i + 1, residue - stuffs[i].getWeight()) + stuffs[i].getValue());
  36. }
  37. record[i][residue] = result;
  38. return result;
  39. }
  40. public static void main(String args[]) {
  41. Stuff stuffs[] = {
  42. new Stuff(2, 3),
  43. new Stuff(1, 2),
  44. new Stuff(3, 4),
  45. new Stuff(2, 2)
  46. };
  47. Knapsack knapsack = new Knapsack(stuffs, 5);
  48. int result = knapsack.solve(0, 5);
  49. System.out.println(result);
  50. }
  51. }
  52. class Stuff{
  53. private int weight;
  54. private int value;
  55. public Stuff(int weight, int value) {
  56. this.weight = weight;
  57. this.value = value;
  58. }
  59. int getWeight() {
  60. return weight;
  61. }
  62. void setWeight(int weight) {
  63. this.weight = weight;
  64. }
  65. int getValue() {
  66. return value;
  67. }
  68. void setValue(int value) {
  69. this.value = value;
  70. }
  71. }

 

动态规划的用法——01背包问题相关推荐

  1. 【动态规划】P1048 01背包问题:采药

    时间对应容量,用01背包 [动态规划笔记]01背包问题及优化_m0_52043808的博客-CSDN博客 代码: #include<iostream> using namespace st ...

  2. vs2017\vs2019 动态规划算法实现0-1背包问题 C

    这是针对于博客vs2017安装和使用教程(详细)和vs2019安装和使用教程(详细)的动态规划算法实现0-1背包问题的示例 目录 一.问题描述

  3. 动态规划:关于01背包问题 I

    动态规划:关于01背包问题,你该了解这些! 对于面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包. 如果这几种背包,分不清,我这里画了一个图,如下: 至于背包九讲其其他背包, ...

  4. 动态规划(一):0-1背包问题

    目录 前言 一.原理 1.1 最优子结构性质 1.2 递归关系 二.算法描述 2.1 算法描述 2.2 图解 2.3 构造最优解 三.0−10-10−1 背包问题相关题目 3.1 题目 3.2 源程序 ...

  5. 动态规划总结三01背包问题

    01背包问题一般是利用动态规划进行解题的,这里通过leetcode1049来讲解01背包的解题思路以及如何对01背包应用题目转换和理清思路 01背包问题: 这里借用学习公众号代码随想录的一张图来说明背 ...

  6. 代码随想录算法训练营第四十二天-动态规划4|● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    今天只有1道题,属于动态规划的01背包问题的应用.首先理解一下动态规划的01背包问题.推荐一个视频,动态规划DP0-1背包,这是我认为讲得最为通透的.很多讲解动态背包问题的,一上来就画二维表格,遍历背 ...

  7. 【动态规划笔记】01背包问题:leetcode415 分割等和子集

    416. 分割等和子集 问题的另一种表述: 给定一个数组nums,判断是否可以从数组中选出一些数,使得这些数之和等于元素和的一半. 此问题为01背包问题. 该问题的一般描述为:能否选择若干物品,使它们 ...

  8. 【动态规划笔记】01背包问题及优化

    dp[i][j]:在前i件物品中选出若干件,放入容量为j的背包,能获得的最大价值 考虑第i件物品 [拿]  还是  [ 不拿 ] (1)j < c[i] 时,背包容量为j,而第i件物品重量大于j ...

  9. C++动态规划算法之0-1背包问题

    0-1背包问题 题目描述 有 n 件物品, 每件物品有一个价值和一个重量,分别记为: b1,b2, -bn w1,w2, -wn 其中所有的 重量wi 均为整数. 现有一个背包,其最大载重量为W,要求 ...

最新文章

  1. 通讯组基本管理任务一
  2. java类的对象无参与有参_java无参与有参以及setter和getter方法(了解)
  3. 12.MapReduce第2部分(WordCount词频统计、自然连接)
  4. ActiveReports 报表应用教程 (15)---报表换肤
  5. linux修改文件打开最大数(ulimit命令)
  6. Runtime底层原理探究(二) --- 消息发送机制(慢速查找)
  7. 4204. 构造矩阵
  8. linux 下安装wps
  9. kafka下载与安装教程
  10. web 前端面试题50道
  11. myline java线段类,2008010 编写一个线段类 MyLine 联合开发网 - pudn.com
  12. ALive:淘宝双11直播,技术同学却可以“偷懒”?
  13. ubuntu 18.04 pycharm生成快捷方式 ,亲测有效!!
  14. 雅思词汇真经单词共3672个
  15. 小米盒子2刷android tv,【二次搬运】小米盒子3S刷Android TV教程
  16. 七轴分拣机器人设计与MATLAB仿真
  17. python-numpy-pandas
  18. FDC2214+FPGA转换芯片使用和配置(非接触液位检测设计)
  19. 阿里巴巴正在成为操作系统?谁是用户,谁是设备?
  20. 自动泊车之停车位检测算法

热门文章

  1. 【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
  2. 【Java 网络编程】TCP 连接 断开 机制 ( 三次握手 | 四次挥手 )
  3. css 垂直居中的几种方式
  4. Spring MVC中获取当前项目的路径
  5. POJ 2112 Optimal Milking(二分图匹配)
  6. VS2017学习OpenGL时遇到的一些小问题和解决方法
  7. 旋转矩阵、欧拉角、四元数、轴/角之间的转换
  8. 浅谈函数调用的汇编实现细节(用栈来传递参数)
  9. C/C++服务器开发的必备利器–libconfig
  10. [洛谷P5057][CQOI2006]简单题