1092: 最大价值(dollars) 算法 动态规划

Posted 进无止境

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1092: 最大价值(dollars) 算法 动态规划相关的知识,希望对你有一定的参考价值。

题目地址:http://www.hustoj.com/oj/problem.php?id=1092

题目描述

Dave以某种方法获取了未来几天美元对德国马克的兑换率。现在Dave只有100美元,请编程序,使Dave通过几天的美元与德国马克的兑换后能得到最多的美元。

输入

第1行包含一个自然数n(l≤n≤I00),表示Dave所知道的兑换率的天数。
后面跟着n个自然数A (100≤A≤I000)。第i+l行的数A表示第i天的兑换率。它告诉那天他能用100美元购买A马克,或用A马克购买100美元。

输出

只有1行,输出Dave经过n天的兑换后能得到的最多的美元值。结果保留两位小数。注意不一定每天都需要兑换。
说明:由于实数运算存在误差,结果在0.05的误差范围内将被认为是正确的。

样例输入

3
100
150
200
5
400
300
500
300
250

样例输出

200.00 //用力错误,正常输出应该是100
266.66

提示

 

样例2说明:

第一天:100美元换成400德国马克

第二天:400德国马克换成133.3333美元

第三天:133.3333美元换成666.6666德国马克

第四天:不换

第五天:666.6666德国马克换成266.6666美元

 

 

解题思路:

使用动态规划记录每一天的历史的最大价值,然后最后根据历史价值求解!

package com.daxin;


import java.util.Arrays;
import java.util.Scanner;

/**
 * Created by Daxin on 2017/8/20.
 * 动态规划
 */
public class MaxDollarValue {
    public static void main(String[] args) {

//        Scanner cin = new Scanner(System.in);
//        int n = cin.nextInt();
//
//        int[] nums = new int[n];
//
//        for (int i = 0; i < n; i++) {
//            nums[i] = cin.nextInt();
//        }
        int[] nums = {400, 300, 500, 300, 250};
//        int[] nums2 = {100, 150, 200};
//        System.out.println(getMaxValue(nums1));
        System.out.println(getMaxValue(nums));


    }

    public static double getMaxValue(int[] nums) {
        int len = nums.length;
        double[][] table = new double[len][len + 1];//
        table[0][1] = 1;
        for (int i = 0; i < table.length; i++) {

            table[i][0] = nums[i];
        }

        for (int i = 2; i < table[0].length; i++) {

            for (int j = 1; j < table.length; j++) {

                double noChange = table[j - 1][i - 1];

                double change = noChange * nums[j - 1] * 1.0 / nums[j];

                table[j][i] = noChange > change ? noChange : change;


            }

        }


        for(double []ds :table){
            System.out.println(Arrays.toString(ds));

        }

        return Math.floor(table[table.length - 1][table[0].length - 1] * 10000) / 100;
    }

}

  

 

 

 

以上是关于1092: 最大价值(dollars) 算法 动态规划的主要内容,如果未能解决你的问题,请参考以下文章

美国1977年版1 Dollar纸钞价值多少

Java-POJ1013-Counterfeit Dollar

Making N Dollars 拼凑面额N

HDU1217 POJ2240 ZOJ1092 ArbitrageFloyd算法

tweenjs缓动算法使用小实例

C++经典算法问题:背包问题(迭代+递归算法)!含源码示例