zoukankan      html  css  js  c++  java
  • [C++]动态规划系列之币值最大化

    /**
     * 
     * @author Zen Johnny
     * @date 2018年3月31日 下午10:04:48
     *
     */
    package freeTest.dynamicProgramming;
    
    import java.util.Scanner;
    
    /*动态规划之币值最大化*/
    /*
    	问题描述:
    		给定一排n个硬币,其面值均为整数C1, C2, ..., Cn, 这些整数并不一定两两不同。
    		问如何选择硬币,使得在其【原始位置互不相邻】的条件下,所选硬币的总金额最大。
    */
    public class MaxAmount {
    	/*动态规划算法策略*/
    	/*
    		递推关系:F(n)为当前的最大化币值
    			F(n) = max{Cn + F(n-2),F(n-1)},n>1
    			F(0)=0;F(1)=C1;
    	*/
    	public static double maxAmount(double coins[], int pos) {
    		if(pos>1) {
    			return Math.max(maxAmount(coins, pos - 2) + coins[pos], maxAmount(coins, pos - 1));
    		} else if(pos == 1) {
    			return coins[0];
    		} else {//pos == 0
    			return 0;
    		} 
    	}
    	
    	public static void main(String args[]) {
    		Scanner scanner = new Scanner(System.in);
    		int size;
    		double [] coins;
    		
    		System.out.println("硬币个数:");
    		size = scanner.nextInt();
    		coins = new double [size];
    		System.out.println("请输入币值数组:");
    		for(int i=0;i<size;i++) {
    			coins[i] = scanner.nextDouble();
    		}
    		System.out.printf("[Max Amount] %f
    ", maxAmount(coins, size-1));;
    	}
    }
    

      

    output:

    硬币个数:
    9
    请输入币值数组:
    1 1 2 10 6 2 10 8 12 
    [Max Amount] 33.000000
    

      

  • 相关阅读:
    Django框架基础之序列化
    资产采集
    CMDB
    数据库--三层架构
    Django 项目一补充
    评论楼
    图片预览
    验证码
    如何使用C/C++动态库与静态库中的宏
    Matlab 直线方程、采样函数
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/8684638.html
Copyright © 2011-2022 走看看