动态规划在求解硬币问题中的应用(JAVA)--币制最大化、找零问题、硬币收集问题

动态规划:这种算法思想多用来求解最优化问题,因此这里存在一个最优化法则,法则指出最优化问题任一实例的最优解,都是由其子实例的最优解构成的。一般来说,自底向上的动态规划更容易设计,但是带有记忆功能的自顶向下的动态规划跟能高效的解决问题(尤其是针对重叠子的问题)。

1、币值最大化问题:给定一排n枚硬币,面值为正整数c1,c2,...,cn,面值可能相同,请问如何选取硬币,可以使得在其原始位置不相邻的条件下。所选币值总和最大。

思路:我们可以将问题划分为取最后一枚硬币和不取最后一枚硬币。根据不相邻这一条件,若取最后一枚硬币,则我们继续判断前n-2枚硬币中的币值总和最大问题;若不取最后一枚,则我们继续判断前n-1枚硬币中的币值总和最大问题。

由此得到递推方程如下,并且我们已知F(0) = 0,F(1) = c1,

Input:

6

5 1 2 10 6 2

Output:

17

 

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

我们在这个过程中不仅得出了最大金额为17,我们在f[]中也可以求得前i枚硬币(1<=i<=6)的最大金额。时间复杂度和空间复杂度均为O(n)。

 

2、找零问题:假设我们需要找零的金额为n,至少需要多少面值为d1<d2<...<dm的硬币?其中d1 = 1,且每种面值的硬币无限制。

思路:我们可以理解获得n的途径为:在总金额为n-dj的一堆硬币中在找一枚面值为dj的硬币,其中j=1,2,...,m,且n>=dj。因此找到一个满足要求的dj使得F(n-dj) + 1最小的dj即可。由于1是常量,所以我们需要专注寻找一个最小的F(d-dj)。

由此得到的递推公式如下,且一直F(0) = 0

Input:

6

1 3 4

Output:

2

 

import java.util.Scanner;public class Main {static int[] c = new int[10];static int[] f = new int[10];static int sum;static Scanner in = new Scanner(System.in);public static void main(String[] args) {sum = in.nextInt();int n = in.nextInt();c[1] = 1;for (int i = 2; i <= n; i++) {c[i] = in.nextInt();}System.out.println(changeMaking(n));}private static int changeMaking(int n) {for (int i = 1; i <= sum; i++) {int temp = 99999999;int j = 1;while (j <= n && i >= c[j]) {temp = Math.min(f[i-c[j]], temp);j++;}f[i] = temp +1;}return f[sum];}
}

3、硬币收集问题:在n*m格模板中放有一些硬币,每格的硬币数目最多为一个。从左上方开始收集,尽可能收集多的硬币直到右下角对于每个单元格来说,只能取对应右边一格或者下边一格的硬币。试求出最大的硬币数及相应的路径。思路:我们假设F(i, j)为行走到(i, j)所能收集到的最大硬币数。单元格(i, j)可以经由上方(i-1, j)和左侧单元格(i, j-1)到达。单元格(i-1 ,j)对应的最大硬币数为F(i-1, j),(i, j-1)对应的最大硬币数为F(i, j - 1)。当然,第一行单元格上方没有单元格,第一列单元格左边没有单元格,即F(i-1, j) = 0,F(i, j-1) = 0,所以其递推公式为:

 

Input:

5 6

0 0 0 0 1 0

0 1 0 1 0 0

0 0 0 1 0 1

0 0 1 0 0 1

1 0 0 0 1 0

Output:

5

 

import java.util.Scanner;public class Main {static int[][] c = new int[10][10];static int[][] f = new int[10][10];static int sum, n, m;static Scanner in = new Scanner(System.in);public static void main(String[] args) {n = in.nextInt();m = in.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {c[i][j]  = in.nextInt();}}f[1][1] = c[1][1];System.out.println(coinCollection());}private static int coinCollection() {/*** 左上角,初始位置* */f[1][1] = c[1][1];/*** 第一列只有上方来的* */for (int i = 2; i <= n; i++) {f[i][1] += f[i-1][1];}/*** 第一行只有左侧来的* */for (int j = 2; j <= m; j++) {f[1][j] += f[1][j-1];}for (int i = 2; i <= n; i++) {for (int j = 2; j <= m; j++) {f[i][j] = Math.max(f[i-1][j], f[i][j-1]) + c[i][j];}}return f[n][m];}
}

 

 

 

 

 

 

 

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

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

相关文章

使用网络TCP搭建一个简单文件下载器

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 目录 一丶项目介绍 二丶服务器Server 三丶测试TCP server服务器 四丶客户端Client 五丶测试客户端向服务器下载文件 一丶项目介绍 1.叙述 生活中大家…

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

动态规划在求解背包问题中的应用 背包问题向来是动态规划的典型问题&#xff0c;给定n个重量为w1,w2,...,wn&#xff0c;价值为v1,v2,...,vn的物品和一个称重量为W的背包&#xff0c;求这些物品中最优价值的一个子集&#xff0c;且能够装到背包中。 之前用蛮力法做过背包问题蛮…

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;、…

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

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

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

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

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

哈夫曼编码&#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;https://www.cnblogs.com/xdp-gacl/p/3777987.html 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。  把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途&#xff1a; 1&#xff09; 把对象的字节序列永…

安装oracle 11g时,报启动服务出现错误,找不到OracleMTSRecoveryService的解决方法

1、打开注册表看看&#xff1a;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下&#xff0c;找到OracleMTSRecoveryService及OracleRemExecService&#xff0c;查看ImagePath对应路径。 2、修改ImagePath路径为xxxxxxx\dbhome_1\bin\xxxxxxxxx即可【修改为你本地真实路…

django系列5.1--ORM对数据库的操作

Django--—ORM数据库操作(图书管理系统基本实例) 一.基本知识 MVC模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff…

蓝桥杯第七届决赛JAVA真题----路径之谜

路径之谜小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 n x n 个方格。【如图1.png】所示。按习俗&#xff0c;骑士要从西北角走到东南角。 可以横向或纵向移动&#xff0c;但不能斜着走&…