动态规划解决币值最大化问题
币值最大化
问题描述
- 给定一排n个硬币,其面值均为整数c1, c2, …, cn, 这些整数并不一定两两不同。问如何选择硬币,使得在其原始位置互不相邻的条件下,所选硬币的总金额最大。
解题思路
上述最大可选金额用f(n)表示,我们可以将所有可行的选择划分为两组:包括最后一枚硬币的和不包括最后一枚硬币的。第一组中,可选包含最后一枚硬币的,最大金额为Cn+f(n-2),即最后一枚硬币加上前面n-2枚硬币可选的最大金额。按照f(n)的定义,另一组中可选的最大金额为f(n-1),即前n-1枚硬币的最大金额。
可得出符合初始条件的递推方程:
f(n)=max{Cn+f(n-2),f(n-1)}
f(0)=0,f(1)=c1
再用回溯的方法得到获取最大值的各个币值
用币值大小为5 1 2 10 6 4 的几枚硬币为例子
通过上述方程列表:
再通过回溯法得到所选择的硬币
分为两种情况,即选择了第n-1个和没选择第n-1个硬币,如果f(n)=f(n-1)则选择了第n-1个反之则没有选择第n-1个。
代码如下所示:
// a币值最大化.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include"math.h"#define max(x,y) (x>y)?x:y#define MAX 20int c[MAX];//代表价值int f[MAX];int coinmax(int n){c[0] = 0;//初始化c[0]及f[0]f[0] = 0;f[1] = c[1];for (int i = 2; i <= n; i++){f[i] = max(c[i] + f[i - 2], f[i - 1]);//获取最大币值}return f[n];}int main(){int n;printf("请输入有多少个纸币:");scanf("%d", &n);printf("请分别输入纸币的价值:");for (int i = 1; i <= n; i++){scanf("%d", &c[i]);}int arr[MAX];//定义arr数组表示所选择的硬币int num = 0;printf("最大币值为:%d\n", coinmax(n));for (int i = n; i >= 1; i--){if (f[i] == f[i - 1])//选择了第i-1个,然后再将第i-1个放进arr数组{arr[num++] = c[--i];}else{arr[num++] = c[i--];//没有选择第i-1个则将他本身先放入数组,//然后再将数组c的下标减一,arr的下标加一}}printf("各个币值为:");for (int i = 0; i<num; i++)printf("%d ", arr[i]);}
- 运行结果如下:
动态规划解决币值最大化问题相关推荐
- 动态规划——硬币找零和币值最大化问题
一.硬币找零问题 1.问题 有面值为1元.3元和5元的硬币若干枚,给定一个输入面额,问如何采用最少的硬币数目,得到当前面额 2.思路 找出状态转移方程,每次可以拿取1元.3元或者5元的硬币,每次拿取, ...
- 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析
// 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...
- 最大子段和动态规划_动态规划解决最大正方形问题
今天的问题 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 来 ...
- 用动态规划解决最长公共子序列
要求:最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S ...
- c++动态规划解决一系列数中互不相邻数字之和的最大值
c++动态规划解决一系列数中互不相邻数字之和的最大值 问题描述 解决思路 C++代码编写 运行结果 问题描述 给定一系列数字{1,2,4,1,7,8,3},要求其中互不相邻的数字之和的最大值. 解决思 ...
- 动态规划解决0-1背包问题详解(图文并茂)
动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...
- 动态规划解决最长公共子序列
动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...
- 动态规划解决01背包问题
转自:https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 一.问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包 ...
- 萌新做点小玩意儿DAY-4 动态规划解决多边形游戏
还是先简单的介绍一下动态规划的算法思想,跟分治法的思想相似的是把一个比较大的问题分解成若干子问题,而分治法分解出来的子问题都是相同规模有相同的解决办法的,动态规划可以通过空间换时间来解决这些相同的问题 ...
最新文章
- 10.Stream流
- 12月12日学习内容整理:Ajax中的contentType参数,csrf跨域请求处理,serialize方法...
- 如何调用别人提供的API?
- 019_ColorPicker颜色选择器
- web自动化测试常见面试题
- SpringBoot加Jquery实现ajax传递json字符串并回显消息(已实践)
- 弹出框页面中使用jquery.validate验证控件
- 翻译:集群索引:通往SQL Server索引级别3的阶梯
- 在Java中实现过滤器和面包店锁
- c++中的set容器和multiset容器
- 73种网页常用js代码
- 各种泵的图形符号_常见液压系统中液压元件图形符号
- 线性表的链式存储结构 ( 链表 )
- 中国网络视频前景 表面云淡风轻实在暗潮汹涌
- OSChina 周三乱弹 ——送你们个漂亮妹子!
- 小米/红米 手机内部存储空间其它文件怎么删除内部存储空间不足
- repost ACM算法竞赛生涯
- 人体红外传感器HC-SR501
- 来 给朕手写一个OOM异常的栗子
- Cortex-M3与Cortex-M4的比较
热门文章
- JAVA多线程下高并发的处理经验
- java编译报错提示编码gbk的不可映射字符啥意思_解决java编译错误:编码GBK的不可映射字符...
- 冒泡排序法(C语言)
- pe没法给服务器装系统吗,U盘重装系统无法进入PE解决方法
- ubuntu如何卸载软件
- The requested resource (Servlet action is not available) is not available.这个问题让我通宵了一个晚上
- 解决金山打字通不能缩小窗口问题
- shell中将字符串转换成数字
- 【图像去噪】兴智杯论文复现赛——NAFNet
- linux xz命令