[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