币值最大化

问题描述

  • 给定一排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.问题 有面值为1元.3元和5元的硬币若干枚,给定一个输入面额,问如何采用最少的硬币数目,得到当前面额 2.思路 找出状态转移方程,每次可以拿取1元.3元或者5元的硬币,每次拿取, ...

  2. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  3. 最大子段和动态规划_动态规划解决最大正方形问题

    今天的问题 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 来 ...

  4. 用动态规划解决最长公共子序列

    要求:最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S ...

  5. c++动态规划解决一系列数中互不相邻数字之和的最大值

    c++动态规划解决一系列数中互不相邻数字之和的最大值 问题描述 解决思路 C++代码编写 运行结果 问题描述 给定一系列数字{1,2,4,1,7,8,3},要求其中互不相邻的数字之和的最大值. 解决思 ...

  6. 动态规划解决0-1背包问题详解(图文并茂)

    动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...

  7. 动态规划解决最长公共子序列

    动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...

  8. 动态规划解决01背包问题

    转自:https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 一.问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包 ...

  9. 萌新做点小玩意儿DAY-4 动态规划解决多边形游戏

    还是先简单的介绍一下动态规划的算法思想,跟分治法的思想相似的是把一个比较大的问题分解成若干子问题,而分治法分解出来的子问题都是相同规模有相同的解决办法的,动态规划可以通过空间换时间来解决这些相同的问题 ...

最新文章

  1. 10.Stream流
  2. 12月12日学习内容整理:Ajax中的contentType参数,csrf跨域请求处理,serialize方法...
  3. 如何调用别人提供的API?
  4. 019_ColorPicker颜色选择器
  5. web自动化测试常见面试题
  6. SpringBoot加Jquery实现ajax传递json字符串并回显消息(已实践)
  7. 弹出框页面中使用jquery.validate验证控件
  8. 翻译:集群索引:通往SQL Server索引级别3的阶梯
  9. 在Java中实现过滤器和面包店锁
  10. c++中的set容器和multiset容器
  11. 73种网页常用js代码
  12. 各种泵的图形符号_常见液压系统中液压元件图形符号
  13. 线性表的链式存储结构 ( 链表 )
  14. 中国网络视频前景 表面云淡风轻实在暗潮汹涌
  15. OSChina 周三乱弹 ——送你们个漂亮妹子!
  16. 小米/红米 手机内部存储空间其它文件怎么删除内部存储空间不足
  17. repost ACM算法竞赛生涯
  18. 人体红外传感器HC-SR501
  19. 来 给朕手写一个OOM异常的栗子
  20. Cortex-M3与Cortex-M4的比较

热门文章

  1. JAVA多线程下高并发的处理经验
  2. java编译报错提示编码gbk的不可映射字符啥意思_解决java编译错误:编码GBK的不可映射字符...
  3. 冒泡排序法(C语言)
  4. pe没法给服务器装系统吗,U盘重装系统无法进入PE解决方法
  5. ubuntu如何卸载软件
  6. The requested resource (Servlet action is not available) is not available.这个问题让我通宵了一个晚上
  7. 解决金山打字通不能缩小窗口问题
  8. shell中将字符串转换成数字
  9. 【图像去噪】兴智杯论文复现赛——NAFNet
  10. linux xz命令