取硬币问题最优策略

有n个不同币值的硬币,编号wei
摘要由CSDN通过智能技术生成

有n个不同币值的硬币排成一列,甲乙两人轮流取这些硬币,每次只能从一端取一枚。假设甲乙两人都足够聪明,会采用最优策略以使自己所取得的硬币币值总和尽量大,求先取的一人所取到的总币值?

    假设当前有k枚硬币,左右两端硬币为left、right,总币值为Sum(left,right),此轮取币采用最优策略可获得总币值记为M(left,right),较差一方获得总币值记为L(left,right)则:

    M(k) = max(v[left] + L(left + 1,right) , v[right] + L(left, right - 1))       其中L(left,right) = Sum(left, right) - M(left, right)


剩1枚硬币,直接取;

剩2枚硬币,取大端;

剩3枚硬币,取大端;

剩4枚硬币,v1 v2 v3 v4,如果v1 + M(2,4) > v4 + M(1,3) 取1,否则取4;

......

    每次取硬币都是两人一轮博弈,一人采取最优策略获得较好收益,那么另一人必然获得较差收益,所以最佳策略是每次取两端中币值与下一次较差收益之和较大的一枚。

#include <iostream>
using namespace std;

int best(int v[],int valueSum, int left, int right)
{
	if(right - left > 1)
	{
		int leftSum = valueSum - be
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值