金钱兑换问题 动态规划相关学习

这篇博客探讨了如何使用动态规划解决金钱兑换问题,包括最小硬币数量的计算和最大化外汇收益的策略。文章通过实例介绍了动态规划的递推公式,并讨论了不同货币之间的兑换问题,提供了处理此类问题的代码思路。
摘要由CSDN通过智能技术生成

1、金钱兑换问题 动态规划 打印兑换后的硬币
来源:https://blog.csdn.net/u014311181/article/details/49781561
有一个货币系统,有n 种硬币,每种硬币的面值为 v1,v2,……,vn, 且 v1 必定为 1 , 目的是兑换价值为 sum 的钱,让硬币数量最少。
result[ j ] 表示价值总钱为 j 的最少硬币数,

print[ j ] 表示价值钱数为 j 时用的是哪个硬币来换的。

当只有 1 种 硬币时, 即只有面值为 1 的硬币,那有多少钱,兑换后的数量肯定就是多少。所以 result[ j ] = j, j = 0,…,sum

当考虑第 i (2,……,n ) 种硬币时, 如果当前的价值钱数大于这种硬币的面值,且用这种硬币兑换后的硬币总数量要比不用这种硬币兑换少的话,就兑换,否则不兑换,

递推公式为:

result[ j ] = max{ result[ j ], result[ j-v[i]+1 ] }; result[ j ] 大说明不兑换的硬币少,否则兑换后的硬币少。

2、利用动态规划解决实际问题之多次兑换获取最大外汇收益
https://blog.csdn.net/z84616995z/article/details/38143231
题目:

15.3-6假定你希望兑换外汇,你意识到与其直接兑换,不如进行多种外币的一系列兑换,最后兑换到你想要的那种外币,可能会获得更大收益。假定你可以交易n种不同的货币,编号为1,2…n,兑换从1号货币开始,最终兑换为n号货币。对每两种货币i和j给定汇率rij,意味着你如果有d个单位的货币i,可以兑换dr0个单位的货币j.进行一系列的交易需要支付一定的佣金,金额取决于交易次数。令ck表示k次交易需要支付的佣金。证明:如果对所有k=1,2…n,ck=0,那么寻找最优兑换序列的问题具有最优子结构性质。然后请证明:如果佣金ck为任意值,那么问题不一定具有最优子结构性质。

3、系统需要提供人民币(CNY)、美元(USD)、英镑(GBP)、港币(HKD)兑换功能。
当前价值满足:1GBP > 1USD > 1CNY > 1HKD
输入人民币兑港元的汇率rate1,美元兑人民币的汇率rate2,英镑兑美元的汇率rate3,任意币种的钱数 sum 合和钱币类型type,兑换方式。当采用最小面值兑换时,输出面值最小的兑换方式;当采用最大面值兑换时,输出面值最大的兑换方式;
例如:显然最大面值兑换时,换成港元面值最大;换成高价值的英镑后,面值小。
输入:2 8 2 127 HKD MIN
(1)第1个数表示1CNY兑换多少HKD;
(2)第2个数表示1USD 兑换多少CNY;
(3)第3个数表示1GBP兑换多少USD;
(4)第4个数表示当前钱币总数;
(5)第5个数表示当前钱币类型;
(6)第6个数表示期望的兑换方式,MIN表示面值最小兑换,MAX表示面值最大兑换;
输出兑换后的钱币:例如:输入:2 8 2 127 HKD MIN时,输出:3 GBP 1 USD 7 CNY 1HKD
说明:(7)转换代码不需要考虑证书溢出。
(8)汇率认为都为整数。

参考代码:

import java.util.Scanner;

public class Main {
   
    private static final String ERROR = "ERROR";

    // 货币类型枚举
    private enum CurrencyType {
   
        HKD, CNY, USD, GBP;
    }

    // 最大最小枚举
    private enum ExType {
   
        MAX, MIN;
    }

    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextLine()) {
   
            String line = scanner.nextLine();
            String[] params = line.split(" ");

            Object[] results = checkAndGetParam(params);
            if (!(Boolean) results[0]) {
   
                System.out.</
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值