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
    

      

  • 相关阅读:
    [NOIP2010] 引水入城
    BZOJ 3038 线段树
    [Tyvj 1728]普通平衡树 5种姿势 (彩蛋)
    BZOJ 1588: [HNOI2002]营业额统计
    BZOJ 2141 排队 线段树套替罪羊
    BZOJ 3629 [JLOI2014] 聪明的燕姿 dfs
    P1546 [USACO3.1]最短网络 Agri-Net(洛谷)
    并查集详解+模板
    sync_with_stdio和cin.tie(0); cout.tie(0);
    拓扑排序详解
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/8684638.html
Copyright © 2011-2022 走看看