Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用2个数字求和的方法数_Algorithm_Combinations - Fatal编程技术网

Algorithm 使用2个数字求和的方法数

Algorithm 使用2个数字求和的方法数,algorithm,combinations,Algorithm,Combinations,我需要用数字1和2找到一个求和(比如1000000)的方法。秩序很重要。我使用以下组合制作了一个解决方案: 其中n是总和 例如: 对于n=7,有21种方法 111111111112111121111211112111121111111211111111122…122212222221221 这个数可能非常大,我必须找到它模一些大素数。(是的,这是在线编码比赛的一个小问题)。 我需要一个更方便电脑的公式。有什么帮助吗? 或者可以通过创建递归和矩阵求幂来实现吗?以下是我的想法: def onesA

我需要用数字1和2找到一个求和(比如1000000)的方法。秩序很重要。我使用以下组合制作了一个解决方案:

其中
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)]