[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\n", maxAmount(coins, size-1));;
	}
}

  

output:

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

  

转载于:https://www.cnblogs.com/johnnyzen/p/8684638.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值