Algorithm 计算求和的方法N

Algorithm 计算求和的方法N,algorithm,Algorithm,对于任何非负整数K,假设我们正好有两个值为2^K的硬币(即,两个是K的幂) 现在我们得到了一个长的N。我们需要找到不同的方法,我们可以用我们拥有的硬币来表示N的值 (如果表示中出现不同次数的值,则认为两种表示不同。) 示例:假设N=6,则答案为3,因为在这种情况下,以下三种表示是可能的: {1, 1, 2, 2} {1, 1, 4} and {2, 4} 如果N可以达到10^18,该怎么做?我们可以从一个简单的解决方案开始,其中有一个2,其余的1。这当然要求N至少为3。否则,就没有解决方案:

对于任何非负整数K,假设我们正好有两个值为2^K的硬币(即,两个是K的幂)

现在我们得到了一个长的N。我们需要找到不同的方法,我们可以用我们拥有的硬币来表示N的值

(如果表示中出现不同次数的值,则认为两种表示不同。)

示例:假设N=6,则答案为3,因为在这种情况下,以下三种表示是可能的:

{1, 1, 2, 2}
{1, 1, 4} and 
{2, 4}

如果N可以达到10^18,该怎么做?

我们可以从一个简单的解决方案开始,其中有一个
2
,其余的
1
。这当然要求
N
至少为3。否则,就没有解决方案:

coins1 = N - 2
coins2 = 1
nSolutions = 1
让我们首先讨论查找
M
相等硬币的可能合并操作数量的任务,其中每个硬币都必须合并(即仅使用一种硬币类型)。这是由
2
计算的
M
的可能整数除数。此过程可以缓存中间结果以更快地执行后续调用(请参见动态编程)

但这有什么用呢?在当前状态下,我们现在可以将两个
1
替换为一个
2
。可以这样做,直到不再有两个
1
,总共
楼层(N/2-1)
次。在每次合并之后(实际上,在第二次合并之后就足够了),我们必须检查所有
2的
可以合并的频率。该州仍有
1的
,因此我们不能使用其他硬币类型:

while(coins1 >= 3)
{
    coins1 -= 2;
    coins2 += 1;
    nSolutions += 1;
    nSolutions += findNumberOfMerges(coins2); //this could be improved
}
如果
while
处于左侧,则剩余一个或两个
1
。如果还有一个,我们就完成了,因为这个必须始终存在,并且我们已经检查了所有可能的组合,以不同的方式表示
2的

if(coins1 == 1)
    return nSolutions;
在另一种情况下,我们可以再次合并。但是,这不会导致有效状态,因为没有第二种硬币类型。但我们可以再次合并以获得有效状态(一个
4
(变成
coins2
),其余
2的
(变成
coins1
):


现在我们的状态与开始时相似,因此可以再次运行整个过程。一次又一次,直到它返回。

我不知道
N
K
有什么关系。在本例中,您显然拥有两枚以上的硬币(最多4枚),但它们的总和不等于
N=3
。那么你到底想做什么呢?在
N
K
之间有什么关系吗?必须有一些关系,否则问题就解决不了了@NicoSchertler也很明显,K必须满足2^K,所以你想知道,对于
k1>k2
,方程
N=m1*2^(2^k1)+m2*2^(2^k2)
存在多少个可能的解?准确吗?这是一个组合问题,不是编程问题。尝试
coins1 = coins2 + 1 - 2;
coins2 = 1;
nSolutions += 1;