Algorithm 使用2个数字求和的方法数
我需要用数字1和2找到一个求和(比如1000000)的方法。秩序很重要。我使用以下组合制作了一个解决方案: 其中Algorithm 使用2个数字求和的方法数,algorithm,combinations,Algorithm,Combinations,我需要用数字1和2找到一个求和(比如1000000)的方法。秩序很重要。我使用以下组合制作了一个解决方案: 其中n是总和 例如: 对于n=7,有21种方法 111111111112111121111211112111121111111211111111122…122212222221221 这个数可能非常大,我必须找到它模一些大素数。(是的,这是在线编码比赛的一个小问题)。 我需要一个更方便电脑的公式。有什么帮助吗? 或者可以通过创建递归和矩阵求幂来实现吗?以下是我的想法: def onesA
n
是总和
例如:
对于n=7
,有21种方法
111111111112111121111211112111121111111211111111122…122212222221221
这个数可能非常大,我必须找到它模一些大素数。(是的,这是在线编码比赛的一个小问题)。
我需要一个更方便电脑的公式。有什么帮助吗?
或者可以通过创建递归和矩阵求幂来实现吗?以下是我的想法:
def onesAndTwos(num):
if num <= 0:
return set()
elif num == 1:
return set([(1, 0)])
elif num == 2:
return set([(2,0), (0, 1)])
else:
setA = set([(1 + x[0], x[1]) for x in onesAndTwos(num-1)])
setB = set([(x[0], 1 + x[1]) for x in onesAndTwos(num-2)])
setA.update(setB);
return setA
print onesAndTwos(10)
print len(onesAndTwos(10))
这在某种程度上是一种动态规划方法,其中我们有一组重复出现的子问题和类似的结构,允许我们在以前的解决方案的基础上进行构建。这不是最优的,因为你没有重用两个分支中先前计算的值(第一个取1,第二个取2),所以我认为这是一个幼稚的解决方案。
public class Fibonacci {
public static int magic(int input) {
if (input == 1) {
return 1;
} else if (input == 2) {
return 2;
} else {
return magic(input-1) + magic(input-2);
}
}
public static void main(String args[]) {
int input = 7;
int numberOfCombinations = magic(input);
System.out.println("The total number of combinations for the given integer "+input+" is "+numberOfCombinations);
}
}
完整的Java代码。您可以在比赛中随意使用它。我希望代码能够自我解释底层算法。祝你好运 这样做的方法的数量等于第n个斐波那契数F(n),很容易计算
归纳法证明。假设n为真。考虑长度为n+1的序列。这可以通过将1添加到总n的序列中,或将2添加到总n-1的序列中来形成。这是不同的,代表了所有的可能性
所以F(n+1)=F(n)+F(n-1)
F(1)=1
整洁,是吗?你要找的数字是第n个斐波那契数。
最好的方法(因为你说n可能真的很大)是实现这个递归的O(logn)
公式(这些是2x2矩阵,很抱歉格式不好)
也许显式形式比递归形式更适合您:
[1 1]^n = [F(k+1) F(k) ]
[1 0] [ F(k) F(k-1)]
这是我所知道的计算斐波那契数的最快方法。
请记住,输出增长非常快,因此您无法缓存大n的结果。如果是在线编码竞赛,请其他人解决如何证明您的编码能力?抱歉,这里没有帮助。这里有一个提示:要获取n
的和,您可以选择1
并获取n-1
的和,或者选择2
并获取n-2
的和。这个递归提醒了你什么吗?另一个提示:计算n=1
到n=6
的值。有什么可疑的吗?
[F(n+2)] = [1 1] [F(k+1)]
[F(n+1)] [1 0] [F (k) ]
[1 1]^n = [F(k+1) F(k) ]
[1 0] [ F(k) F(k-1)]