【问题标题】:Check subset sum for special array equation检查特殊数组方程的子集总和
【发布时间】:2019-10-12 15:28:14
【问题描述】:

我试图解决以下问题。

我们得到 N 和 A[0]

N <= 5000
A[0] <= 10^6 and even 
if i is odd then 
A[i] >= 3 * A[i-1]
if i is even
A[i]= 2 * A[i-1] + 3 * A[i-2]
element at odd index must be odd and at even it must be even.

我们需要最小化数组的总和。

我们得到一个 Q 数

 Q <= 1000
 X<= 10^18

我们需要确定是否有可能从我们的数组中得到 subset-sum = X。

我尝试过的,

创建一个最小和数组很容易。只需遵循方程式和约束即可。

我所知道的子集和的方法是动态编程,它具有时间复杂度 sum*sizeof(Array) 但由于 sum 可以高达 10^18,因此该方法不起作用。

我是否缺少任何方程关系?

【问题讨论】:

  • 您可能会错过序列达到真正大值的速度。 (我相信我在过去几个月内看到了这个问题的答案,但我没有指向它的链接。)

标签: arrays algorithm data-structures subset-sum


【解决方案1】:

我们可以通过一些数学来实现: 对不起,乳胶我不确定它是否可能在堆栈上?

X_n 成为序列(与您的A 定义的相同)

我假设X_0 是肯定的。

因此,当X_{2n+1} = 3X_{2n} 时,序列严格递增且最小化

我们可以计算出X_{2n}X_{2n+1}的通用项

v_0 = 
X0
X1

v_1 = 
X1
X2

v_0v_1之间的关系是

M_a = 
0 1
3 2

v_1v_2之间的关系是

M_b = 
0 1
0 3

因此v_2v_0 之间的关系是

M = M_bM_a = 
3 2
9 6

我们推断

v_{2n} = 
X_{2n}
X_{2n+1}

v_{2n} = M^n v_0

遵循经典的对角化......我们(除非弄错)得到

X_{2n} = 9^n/3 X_0 + 2*9^{n-1}X_1
X_{2n+1} = 9^n X_0 + 2*9^{n-1}/3X_1

回忆一下X_1 = 3X_0

X_{2n} = 9^n X_0
X_{2n+1} = 3.9^n X_0

现在,如果我们表示要以 9 为底的总和,我们得到

       9^{n+1}        9^n
___   ________  ___   ___
      X^{2n+2}        X^2n

X^{2n} 的地方,我们只能放一个1 或一个0(这意味着我们从A 中取出2n-th elem) 我们也可以将3 放在X^{2n} 的位置,这意味着我们从数组中选择了2n+1th elem

所以我们只需要分解基数9 中的数字,并检查它的所有数字是否是0,13(以及它的前导数字是否超出我们的数组范围...... )

【讨论】:

    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多