动态规划在求解背包问题中的应用

背包问题向来是动态规划的典型问题,给定n个重量为w1,w2,...,wn,价值为v1,v2,...,vn的物品和一个称重量为W的背包,求这些物品中最优价值的一个子集,且能够装到背包中。

之前用蛮力法做过背包问题蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题

这篇文章中采用动态规划思想解决,我们首先要推导出一个关系,用较小子实例的解来表示背包问题整体实例的解。我们先来考虑前i个物品(1<=i<=n)定义的实例,物品重量分别为w1,w2,...,wi,价值分别为v1,v2,...,vi,背包承重量为j(1<=j<=W)。设F(i, j)表示该实例的最优解的物品总价值,那么对于这样一个实例,我们可以分为不取第i个物品和取第i个物品两种情况,如果不取第i个物品,那么最优子集的价值为F(i-1, j);如果取第i个物品,那么总价值为vi+前i-1个物品点1最大价值F(i-1, j-wi)。由此我们得出下面的递推公式:

我们还可以知道初始条件:

当j>=0时,F(0, j) = 0; 当i >= 0时,F(i, 0) = 0

回溯解法:

import java.util.Scanner;public class Main {static int[] w = new int[10];static int[] v = new int[10];static int n, W;static Scanner in = new Scanner(System.in);public static void main(String[] args) {n = in.nextInt();W = in.nextInt();for (int i = 1; i <= n; i++) {w[i] = in.nextInt();v[i] = in.nextInt();}System.out.println(f(n, W));}private static int f(int n, int W) {if(n == 0 || W == 0){return 0;}for(int i = n;i >=0; i--) {if(w[i] > W) {return f(n-1, W);} else {return Math.max(f(n-1, W), f(n-1, W-w[i])+v[i]);}}return 0;}
}

记忆化求解:

import java.util.Scanner;public class Main {static int[] w = new int[10];static int[] v = new int[10];static int[][] f = new int[10][10];static int n, W;static Scanner in = new Scanner(System.in);public static void main(String[] args) {n = in.nextInt();W = in.nextInt();for (int i = 0; i < f.length; i++) {for (int j = 0; j < f[0].length; j++) {f[i][j] = 0;}}for (int i = 1; i <= n; i++) {w[i] = in.nextInt();v[i] = in.nextInt();}System.out.println(f(n, W));}private static int f(int i, int j) {int temp;if(f[i][j] <= 0 && i>0) {if (j < w[i]) {temp = f(i-1, j);} else {temp = Math.max(f(i-1, j), v[i] + f(i-1, j - w[i]));}f[i][j] = temp;}return f[i][j];}
}

由于DP问题经常有重叠子的计算问题,所以自顶向下的记忆化DP方法要优于自底向上的回溯算法。

滚动数组:

import java.util.Scanner;public class Main {static int maxV, maxM, n;static int[] v,k;static int[] f;public static void main(String[] args) {Scanner in = new Scanner(System.in);maxV = in.nextInt();maxM = in.nextInt();f = new int[maxV + 1];n = in.nextInt();v = new int[n + 1];k = new int[n + 1];for (int i = 1; i <= n; i++) {v[i] = in.nextInt();k[i] = in.nextInt();}for (int i = 1; i <= n; i++) {for (int j = maxV; j >= 0; j--) {for (int s = maxM; s >= 0; s--) {if (j >= v[i] ) {f[j] = Math.max(f[j-v[i]] + k[i], f[j]);}}}}System.out.println(f[maxV]);}
}

动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法相关推荐

  1. 【有返回值的回溯法】剑指offer——面试题66:矩阵中的路径(回溯法)

    剑指offer--面试题66:矩阵中的路径(回溯法) Solution:1 典型的回溯算法及代码 此题是回溯法的典型例题,思路以及代码均是书中所讲.要具体实现很有参考价值,借鉴之! 现在把书中代码贴在 ...

  2. C/C++面试题—矩阵中的路径【回溯法应用】

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...

  3. 回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园

    第一次编写,格式写的比较混乱.先把源码上来吧.这个源码是模仿教材上的(本人学生一枚 ).分析过程在下面. #include using namespace std; class Traveling{ ...

  4. 回溯法解旅行商问题java,回溯法-旅行商问题

    一.问题描述 旅行推销员问题(英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路 ...

  5. python 回溯法 01背包问题_回溯法-01背包问题

    一.问题描述 给定 n 件物品,物品的重量为 w[i],物品的价值为 c[i].现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大 二 ...

  6. 动态规划在求解传递闭包问题中的应用(JAVA)--Warshell算法

    动态规划在求解传递闭包问题中的应用: 传递闭包:对于n个顶点有向图来说,如果第i个顶点到第j个顶点之间存在一条有效的有向路径(即长度大于0的路径),那么T(i, j) = 1,否则T(i, j) = ...

  7. 贪婪算法在求解最短路径中的应用(JAVA)--Dijkstra算法

    最短路径问题最经典的算法就是Dijkstra算法,虽然不如Floyd算法能够求全源的最短路径,但是在效率上明显强于Floyd算法. 想了解Floyd算法的读者可以参考动态规划在求解全源最短路径中的应用 ...

  8. java多重背包算法,【动态规划】多重背包问题

    说明 前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题--多重背包. 这个背包,听起来就很麻烦的样子.别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟. 如果没有看过前两篇0 ...

  9. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

最新文章

  1. 为什么都说 Go 是大厂通行证!
  2. Android Studio3.5.2离线安装gradle
  3. linux基本操作之目录、vi等
  4. 回忆自己的大学四年得与失
  5. java连接Redis数据库
  6. 海南计算机网络技术学校,三亚广播电视大学计算机网络技术专业_海南报名_网络教育计算机网络技术专业教学计划_中国教育在线...
  7. 为什么在生产中进行调试是如此诱人?
  8. spring boot配置虚拟路径(替代docBase配置)访问本地图片
  9. sqlite3.OperationalError: no such column: **
  10. 普通人如何月入10万
  11. MVC工作中的笔记~2(架构师是一步一步练成的)
  12. NLP人机对话与落地案例分享
  13. bat批处理文件的简单解密方法(乱码)
  14. 940mx黑苹果驱动_黑苹果 Clover 驱动配置文件分享
  15. github-上传本地代码到github仓库
  16. LabVIEW与西门子1200,1500系列Sanp7协议通讯案例+QMH标准框架编写,非常实用,长期测试通讯无误。
  17. Java - JDBC Best Practices
  18. Android HAL层
  19. 妈妈计算机英语怎么说,妈妈的英文翻译,妈妈英语怎么说
  20. murmur3哈希算法 1

热门文章

  1. 七年级计算机教学质量分析,七年级数学期末教学质量分析报告
  2. 模板消息 php实例,PHP微信模板消息操作示例
  3. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
  4. java面向对象第一课,定义类,模拟人的行为:吃饭工作休息
  5. mysql修改用户密码1133_后台修改mysql用户密码后无法连接
  6. php javascript对象,JavaScript 对象
  7. java注释的理解,java注解原理——记录一下自己的理解
  8. 以相关组为基础的3D物体识别
  9. java md2_GitHub - edzjx/Md2Crypto
  10. vue点击其它侧边栏收缩_企业微信聊天侧边栏功能怎么开启?聊天侧边栏有什么用?...