【问题标题】:All possible combination of an array数组的所有可能组合
【发布时间】:2015-07-30 15:36:36
【问题描述】:

我试图找到一个数组的所有可能组合。我找不到类似的问题,所以我在这里问。

假设我有数组 A 和 N ,整数 T 作为输入,我需要找到数组 S 的所有可能组合,以满足以下不等式。


输入:A(a1,a2,...,ak) , N(n1,n2,...,nk) , int T

输出:S(s1,s2,....sk)

受制于:

总和 ( si*ai )

对于每个 i:si


有什么想法吗?你如何实现它?我将使用 c++ 来实现它。

【问题讨论】:

  • 您说您正在寻找N 的子数组S。然而,有两件事对我来说很突出。如果N=(n1,n2,...,nk)S=(s1,s2,...,sk)|N|=|S| 并且唯一有效的子数组是N=S。您还声明for each i: si <= ni 暗示某些si 元素可能不在N 中。这与我对子数组的理解相反。你能澄清这些观点吗?目前还不清楚,充其量,你在这里寻找什么。
  • @huck_cussler youre right , it is not subarray , I just didnt 知道如何命名它。例如:N=[0,2,3,0,1],一种可能是 S=[0,1,2,0,0] 或 S=[0,2,0,0,1],我更正了问题。
  • ASN 整数、自然数、实数数组...?
  • @huck_cussler N 和 S 是整数数组。 A 可以是实数。

标签: arrays algorithm combinations


【解决方案1】:

会有没有解决方案、无限多解决方案和有限数量解决方案的情况。

首先,定义SUM(X,Y) = x_1*y_1 + x_2*y_2 + ... + x_k*y_k

如果SUM(A,N) <= T 那么N 是一个解决方案。

接下来,让Ni = (n_1, n_2, ..., [n_i]-1, ..., n_k)。如果SUM(A,Ni) < SUM(A,N) 对应于从1k 的任何i,则有无限多的解决方案。我们无法枚举它们,我们已经完成了。

否则,如果N 不是解决方案,那么就没有解决方案,我们就完了。

最后,如果以上两种情况都不成立,那么就有有限多的解决方案。要枚举它们,请再次从i=1 迭代到k,并保持所有其他n 不变,继续将n_i 递减1 以获得Ni' 并检查是否SUM(A,Ni') <= T。跟踪每个 n 的这些范围,因为这些范围将是每个 n 可以独立于其他变量变化并且仍然(可能)给出解决方案的最大范围。

最后,遍历所有确定的n-范围的笛卡尔积并检查每个组合是否是一个解决方案。

我可能仍然缺少一些极端情况,但我相信这主要是一个正确的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 2022-01-18
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多