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

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

背包问题向来是动态规划的典型问题,给定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]);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS跨域问题

因为浏览器的同源策略&#xff0c;默认情况下&#xff0c;JavaScript在发送AJAX请求时&#xff0c;URL的域名必须和当前页面完全一致。 完全一致的意思是&#xff0c;域名要相同&#xff08;www.example.com和example.com不同&#xff09;&#xff0c;协议要相同&#xff08;ht…

svn 服务器的搭建以及客户端的使用

1、svn 服务器的搭建以及客户端的使用&#xff0c;安装见下面的博客 https://blog.csdn.net/zh123456zh789/article/details/80921179 说明&#xff1a;服务器只是用来存储数据&#xff0c;服务器上的数据可以通过客户端torisesvn进行操作。比如将自己的项目存到服务器&#xf…

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

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

Centos 7 LVM xfs文件系统修复

情况1&#xff1a; [sda] Assuming drive cache: write through Internal error xfs XFS_WANT_CORRUPTED_GOTO at line 1662 of file fs/xfs/libxfs/xfs_alloc.c Caller xfs_free_extent0x130 [xfs] Internal error xfs_trans_cancel at line 990 of file fs/xfs/xfs_trans.c.C…

动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法

参考图论算法&#xff08;二&#xff09;-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法&#xff08;JAVA &#xff09;这种算法也叫Floyd-Warshell算法&#xff0c;虽然和Warshell算法名字相近&#xff0c;算法思想也相近&#xff0c;但确实是两种算法。对于一个带权图&a…

录播图的分页使用进度条形式显示

本次我是使用的slick轮播图插件&#xff0c;其官网网址如下&#xff1a; http://kenwheeler.github.io/slick/&#xff0c;下面是轮播图中的代码&#xff0c;如果你不知道效果是什么样子&#xff0c;亦可以去看一下阿里云的官网&#xff1a;https://www.aliyun.com/?utm_conte…

贪婪算法在求解最小生成树中的应用(JAVA)--Prim算法

贪婪算法&#xff1a;通过一系列步骤来构造问题的解&#xff0c;每一步对目前构造的部分分解做一个拓展&#xff0c;直到获得问题的完整解为止,而算法的核心思想就在于&#xff0c;算法的每一步都必须满足以下条件&#xff1a;可行&#xff08;满足问题的约束条件&#xff09;、…

requirements.txt

在文件夹下 生成requirements.txt文件 pip freeze > requirements.txt 安装requirements.txt依赖 pip install -r requirements.txt转载于:https://www.cnblogs.com/z-x-y/p/10420853.html

贪婪算法在求解最小生成树中的应用(JAVA)--Kruskal算法

Kruskal算法又被称为“加边法”&#xff0c;这种算法会将加权连通图的最小生成树看成具有V-1条边的无环子图&#xff0c;且边的权重和最小。算法开始时&#xff0c;会按照权重的非递减顺序对图中的边排序&#xff0c;之后迭代的以贪婪的方式添加边。 下面以下图为例来讲解Krusk…

[ZJOI2016]大森林

Description&#xff1a; 小Y家里有一个大森林&#xff0c;里面有n棵树&#xff0c;编号从1到n 0 l r 表示将第 l 棵树到第 r 棵树的生长节点下面长出一个子节点&#xff0c;子节点的标号为上一个 0 号操作叶子标号加 1&#xff08;例如&#xff0c;第一个 0 号操作产生的子节点…

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

最短路径问题最经典的算法就是Dijkstra算法&#xff0c;虽然不如Floyd算法能够求全源的最短路径&#xff0c;但是在效率上明显强于Floyd算法。 想了解Floyd算法的读者可以参考动态规划在求解全源最短路径中的应用&#xff08;JAVA&#xff09;--Floyd算法 单源最短路径问题是对…

「SCOI2014」方伯伯的 OJ 解题报告

「SCOI2014」方伯伯的 OJ 和列队有点像&#xff0c;平衡树点分裂维护即可 但是需要额外用个set之类的对编号查找点的位置 插入完了后记得splay&#xff0c;删除时注意特判好多东西 Code: #include <cstdio> #include <cctype> #include <set> const int N2e5…

贪婪算法在解决哈夫曼树及编码问题中的应用

哈夫曼编码&#xff0c;是一种可变字长编码(VLC)的高效算法。该算法是Huffman于1952年提出一种编码方法&#xff0c;该方法完全依据字符出现概率来构造异字头的平均长度最短的码字&#xff0c;有时称之为最佳编码。 相比定长编码来说&#xff0c;这种编码实现的压缩率&#xff…

素数筛法求十亿内所有质数的和(C++)

埃拉托斯特尼筛法&#xff08;又称埃氏筛&#xff09;的基本思想是&#xff1a;要得到自然数n以内的全部素数&#xff0c;必须把不大于的所有素数的倍数剔除&#xff0c;剩下的就是素数。 时间复杂度O(nloglogn) #include <iostream> #include <math.h> using na…

spring事务的传播机制新解

以下是事物的传播机制&#xff1a; Transactional(propagationPropagation.REQUIRED)如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)Transactional(propagationPropagation.NOT_SUPPORTED)容器不为这个方法开启事务Transactional(propagationPropagation.REQUIRES_NE…

时空权衡在模式匹配算法中的应用(JAVA)--Horspool算法(简化版BM算法)

模式匹配是数据结构中字符串的一种基本运算&#xff0c;给定一个子串&#xff0c;要求在某个字符串中找出与该子串相同的所有子串。假设P是给定的子串&#xff0c;T是待查找的字符串&#xff0c;要求从T中找出与P相同的所有子串&#xff0c;这个问题成为模式匹配问题。P称为模式…

从wireshake分析http和https的通信过程

参考文章: Wireshark基本介绍和学习TCP三次握手【技术流】Wireshark对HTTPS数据的解密Wireshark/HTTPSJourney to HTTP/2以TCP/IP协议为例&#xff0c;如何通过wireshark抓包分析&#xff1f;TCP三次握手和四次挥手Https详解wireshark抓包演示前言 面试被问到有没有用过抓包工具…

蓝桥杯第六届国赛JAVA真题----密文搜索

标题&#xff1a;密文搜索福尔摩斯从X星收到一份资料&#xff0c;全部是小写字母组成。 他的助手提供了另一份资料&#xff1a;许多长度为8的密码列表。 福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。请你编写一个程序&#xff0c;从第一份资料中搜索可…

Java对象的序列化和反序列化

原文&#xff1a;https://www.cnblogs.com/xdp-gacl/p/3777987.html 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。  把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途&#xff1a; 1&#xff09; 把对象的字节序列永…

蓝桥杯第六届国赛JAVA真题----奇怪的数列

标题&#xff1a;奇怪的数列从X星截获一份电码&#xff0c;是一些数字&#xff0c;如下&#xff1a; 13 1113 3113 132113 1113122113 .... YY博士经彻夜研究&#xff0c;发现了规律&#xff1a; 第一行的数字随便是什么&#xff0c;以后每一行都是对上一行“读出来” 比如第2行…