币值最大化问题 C++C++

问题:给定一排n个硬币,其面值均为整数c1, c2, …, cn, 这些整数并不一定两两不同。问如何选择硬币,使得在其原始位置互不相邻的条件下,所选硬币的总金额最大。

利用F数组记录前n个硬币的最佳选择方案,然后根据最优化原理开始优化。
本文给出了F(n)的递推关系式,代码,时间复杂度以及n=6时的一组示例数据

// 1. F(n)=max{F(n-2)+a[n],F(n-1)}
// 2. isselected数组记录c中对应的数是否被选中,若选中,则记1
#include
#define n 6
using namespace std;
int main()
{
int c[n], i, isselected[n] = { 0 },F[n+1];
for (i = 1; i <= n; i++) cin >> c[i - 1];
F[0] = 0;
F[1] = c[0];
for (i = 2; i <= n; i++)
{
if (F[i - 2] + c[i - 1] > F[i - 1])
{
F[i] = F[i - 2] + c[i - 1];
}
else
F[i] = F[i - 1];
}
i = n;
while (i > 1)
{
if (F[i] == F[i - 1])
{
isselected[i - 1] = 0;
i–;

	}
	else if (F[i] == F[i - 2] + c[i - 1])
	{
		isselected[i - 1] = 1;
		isselected[i - 2] = 0;
		i = i - 2;
	}
}
if (F[3] == F[1] + c[2]) isselected[0] = 1;
cout << F[n] << endl;
for (i = 1; i <= n; i++)
	if (isselected[i - 1] == 1) cout << c[i - 1] << ' ';

}

// 3.T(n)=3n=O(n)
/* 4. c[5]={5,1,2,10,6,2}
i F[n]
0 0
1 5
2 5
3 5+2
4 5+10
5 (5+2)+6
6 (5+10)+2 = 17
*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值