所有可能的阵列组合

时间:2015-07-30 15:36:37

标签: arrays algorithm combinations

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

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

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

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

受制于:

sum(si * ai)< = T

对于每个i:si< = ni

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

1 个答案:

答案 0 :(得分:1)

有些情况下,没有解决方案,无限多的解决方案和有限数量的解决方案。

首先,定义rec.set.values

如果SUM(X,Y) = x_1*y_1 + x_2*y_2 + ... + x_k*y_kSUM(A,N) <= T是解决方案。

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

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

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

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

我可能仍然会遇到一些我不相称的极端情况,但这绝对是我认为的正确解决方案。