目录

1 问题描述

2 解决方案

2.1 动态规划法

 


1 问题描述

给定一排n个硬币,其面值均为正整数c1,c2,...,cn,这些整数并不一定两两不同。请问如何选择硬币,使得在其原始位置互不相邻的条件下,所选硬币的总金额最大。


2 解决方案

2.1 动态规划法

本文所写代码思想参考自《算法设计与分析基础》第三版上一段讲解,具体如下:

具体代码如下:

package com.liuzhen.chapter8;import java.util.ArrayList;public class CoinRow {/** 参数Money:给定硬币组合面值数* 函数功能:以数组链表形式返回最大总金额硬币组合的数组下标以及最大总金额,* 其中链表中最后一个元素为最大总金额,其它元素为硬币组合数组下标*/public ArrayList<Integer> getMaxSumCoin(int[] Money){ArrayList<Integer> list = new ArrayList<Integer>();if(Money.length == 1){             //当给定硬币个数只有一个时,最大总金额即为该枚硬币list.add(0);                   //存放硬币位置list.add(Money[0]);            //存放硬币总金额return list;}int[] tempMaxSum = new int[Money.length];     //用于存放遍历到当前硬币位置(从前到后遍历)的最大总金额tempMaxSum[0] = Money[0];if(Money[0] < Money[1])tempMaxSum[1] = Money[1];elsetempMaxSum[1] = Money[0];for(int i = 2;i < Money.length;i++){if(tempMaxSum[i-1] >= tempMaxSum[i-2] + Money[i])tempMaxSum[i] = tempMaxSum[i-1];elsetempMaxSum[i] = tempMaxSum[i-2] + Money[i];}System.out.println("\n当前位置硬币的最大金额:");for(int i = 0;i < Money.length;i++)System.out.print(tempMaxSum[i]+" ");//根据tempMaxSum数组元素,找出,最大金额的硬币组合元素的数组下标for(int i = Money.length-2;i >=0;i--){int temp = tempMaxSum[i];if(temp < tempMaxSum[i+1]){list.add(i+1);             //存放最大金额硬币组合元素数组下标temp = tempMaxSum[i+1] - Money[i+1];for(int j = 0;j < Money.length;j++){   //寻找到tempMaxSum数组(从小到大排序)中第一个等于temp值的元素if(tempMaxSum[j] == temp){i = j;break;}}}}if(Money[0] >= Money[1])      //不管怎样选择硬币组合,在前两枚硬币中一定会选一枚list.add(0);elselist.add(1);list.add(tempMaxSum[Money.length-1]);     //存放硬币最大总金额return list;}public static void main(String[] args){CoinRow test = new CoinRow();int[] Money = {1,1,2,10,6,2,10,8,12};System.out.println("当前位置硬币的金额:");for(int i = 0;i < Money.length;i++)System.out.print(Money[i]+" ");ArrayList<Integer> list = test.getMaxSumCoin(Money);System.out.println("\n最大总金额硬币组合的数组下标依次为:");for(int i = 0;i < list.size()-1;i++)System.out.print(list.get(i)+" ");System.out.println("\n最大总金额硬币组合的对象数组下标相应面值依次为:");for(int i = 0;i < list.size()-1;i++)System.out.print(Money[list.get(i)]+" ");System.out.println("\n"+"最大总金额为:");System.out.println(list.get(list.size()-1));}
}

运行结果:

当前位置硬币的金额:
1 1 2 10 6 2 10 8 12
当前位置硬币的最大金额:
1 1 3 11 11 13 21 21 33
最大总金额硬币组合的数组下标依次为:
8 6 3 0
最大总金额硬币组合的对象数组下标相应面值依次为:
12 10 10 1
最大总金额为:
33

转载于:https://www.cnblogs.com/liuzhen1995/p/6428458.html

算法笔记_045:币值最大化问题(Java)相关推荐

  1. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

  2. 算法笔记_137:二分图的最大匹配(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...

  3. 算法笔记_218:花朵数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数. 例如: 当N=3时,153就满足条件,因为 1^3 + ...

  4. 排序算法笔记:堆排序 HeapSort in java

    2019独角兽企业重金招聘Python工程师标准>>> /*** 堆排序* 简述:* 首先使用建立最大堆的算法建立好最大堆,然后将堆顶元素(最大值)与最后一个值交换,同时使得堆的长度 ...

  5. java heapsort_排序算法笔记:堆排序 HeapSort in java

    /** * 堆排序 * 简述: * 首先使用建立最大堆的算法建立好最大堆,然后将堆顶元素(最大值)与最后一个值交换,同时使得堆的长度减小1 ,调用保持最大堆性质的算法调整,使得堆顶元素成为最大值,此时 ...

  6. 算法笔记_036:预排序(Java)

    目录 1 问题描述 2 解决方案 2.1 检验数组中元素的唯一性 2.2 模式计算   1 问题描述 在计算机科学中,预排序是一种很古老的思想.实际上,对于排序算法的兴趣很大程度上是因为这样一个事实: ...

  7. 算法笔记_227:填写乘法算式(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 观察下面的算式: * * × * * = * * * 它表示:两个两位数字相乘,结果是3位数.其中的星号(*)代表任意的数字,可以相同,也可以不同, ...

  8. 金九银十面试即将到来!字节内部数据结构与算法笔记,限时上线,Java程序员们准备好了吗?

    前言 不得不说,现在几乎所有的大厂,比如Google.字节.BAT,面试的时候都喜欢考算法.让人现场写代码,那你有没有真正地想过,为什么这些大公司都喜欢考算法呢? 经常有人说,程序员35岁之后很容易陷 ...

  9. 算法笔记_114:等额本金(Java)

    1 等额本金 标题:等额本金小明从银行贷款3万元.约定分24个月,以等额本金方式还款.这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息.假设月利 ...

  10. mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)

    packagecom.liuzhen.practice;importjava.util.ArrayList;importjava.util.Scanner;public classMain {publ ...

最新文章

  1. 解决树莓派Virtualenv虚拟环境下GPIO问题
  2. python中map函数字典映射_python Chainmap函数(19)
  3. CF 1642 F. Two Arrays 随机 + sosdp
  4. 如何将sql server数据库转化成sqlite数据库
  5. dubbo 路由配置_Dubbo-go v1.5.1发布,Dubbo 的 Go实现
  6. php 网络爬虫,爬一下花瓣的图片
  7. 仿宋GB_2312字体在wps,office中的安装下载使用
  8. 【足式机器人--躯干状态估计】(8)躯干状态估计(位置、姿态、速度)代码解析
  9. 大学计算机教师招聘试讲什么,应聘高校教师面试,试讲注意事项
  10. “乌龙学院”的是是非非
  11. 万能的小镇市场能否成为悟空问答的救命良药?
  12. c语言既是素数又是回文数的三位数,编写程序,找出所有既是素数又是回文数的三位正整数.例如:131等...
  13. 云浮农村生活污水处理设备——水生态环境保护“十四五”规划
  14. 记一次EFCore类型转换错误及解决方案
  15. Bootstrap后台管理系统收集
  16. 电脑不能正常连接网络常见问题解决方法
  17. C++ XXTEA加密解密算法
  18. Snaker如何配置期望完成时间、提醒时间、重复提醒间隔
  19. Mac 查询是否支持VT(Intel的Vanderpool的虚拟技术)
  20. MyBatis框架的特性

热门文章

  1. 阿里数据库内核月报:2016年08月
  2. tomcat服务器配置优化
  3. 服务器可以显示的血量显示,魔兽世界怀旧服怪物如何显示血量
  4. java mysql存储图片_Java存储图片到Mysql
  5. python 自动赚钱软件排行榜_微任务兼职平台app下载
  6. 利用bug来进行调试
  7. Redis命令回溯方案
  8. windows 编译 使用bin lib include_YOLOv3-tiny在VS2015上使用Openvino部署
  9. [渝粤教育] 云南大学 中国文化英语桥 参考 资料
  10. Matlab中的逻辑运算:“any”,“all”