Algorithm 计算求和的方法N
对于任何非负整数K,假设我们正好有两个值为2^K的硬币(即,两个是K的幂) 现在我们得到了一个长的N。我们需要找到不同的方法,我们可以用我们拥有的硬币来表示N的值 (如果表示中出现不同次数的值,则认为两种表示不同。) 示例:假设N=6,则答案为3,因为在这种情况下,以下三种表示是可能的: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。否则,就没有解决方案:
{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;