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.</