查找最大硬币和所选硬币数量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找最大硬币和所选硬币数量相关的知识,希望对你有一定的参考价值。
我在做Coin Row问题。我遇到了一个小问题。
有一排n个硬币的价值是一些正整数c1, c2, . . . , cn
,不一定是明显的。
我们的目标是获得最大金额,但受限于您无法获得任何两个相邻的硬币。例如,在下面的例子中,一旦你拿起10
,你不能采取6
或左手2
。
例:
enter the number of coins: 6
enter the value of all coins : 5 1 2 10 6 2
The maximum amount of coin : 17
The selected coins to get maximum value : C1 , C4 , C6
我想获得精选硬币(前面的C1,C4,C6)。
这是我的功能代码,我只能在此代码中获得最大金额。
int getanswer(int array[],int len)
{
int C[20];
for (int j = 0; j < len; j++)
{
C[j + 1] = array[j];
}
int F[20];
F[0] = 0;
F[1] = C[1];
for (int j = 2; j < len+1; j++)
{
F[j] = max(C[j] + F[j - 2], F[j - 1]);
printf("temp :%d
", C[j]);
}
return F[len];
}
如何用我的代码获得精选硬币?
答案
一个好的解决方案将涉及递归,回溯和memoization(动态编程)。编写一个递归例程,尝试从左端开始的每个可用选项,然后在剩余列表上重复。您当前的算法对可见范围内的不平衡值有一个盲点(2个元素输出)。
这里有一些伪代码可以帮助您入手。
int pickup(coin[])
{
// base case: <= 2 coins left
if size(coin) == 0 // return 0 for an empty list
return 0
if size(coin) <= 2 // if only 1 or 2 coins left, return the larger
return max(coin)
// Otherwise, experiment:
// pick *each* of the first two coins, solve the remaining problem,
// and compare results.
pick1 = coin[0] + pickup(coin[2:]) // pick 1st coin; recur on rest of list
pick2 = coin[1] + pickup(coin[3:]) // pick 2nd coin; recur on rest of list
return max(pick1, pick2)
这是普遍的攻击。通过记忆,您可以大大加快解决方案的速度。此外,您需要将此转换为首选的实现语言并添加跟踪,以便获得所需的索引。如果您只需按顺序返回硬币值,则可以很容易地累积这些值的数组,每次返回时都预先存在一个值。
以上是关于查找最大硬币和所选硬币数量的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode1561. 你可以获得的最大硬币数目(C++)