我试图找到一个数组的所有可能组合。我找不到类似的问题所以我在这里问。
假设我有数组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 ++实现它。
答案 0 :(得分:1)
有些情况下,没有解决方案,无限多的解决方案和有限数量的解决方案。
首先,定义rec.set.values
。
如果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)
的任何i
1
,则会有无限多的解决方案。我们无法列举它们,我们已经完成了。
否则,如果k
不是解决方案,那么就没有解决方案,我们就完成了。
最后,如果上述两种情况都不成立,那么解决方案就有限。要枚举它们,再次从N
迭代到i=1
,并保持所有其他k
不变,继续将n
递减1以获得n_i
并检查{是否{ {1}}。跟踪每个Ni'
的这些范围,因为这些范围是每个SUM(A,Ni') <= T
可以独立于其他n
变化的最大范围,并且仍然(可能)提供解决方案。
最后,迭代确定所有n
- 范围的笛卡尔积,并检查每个组合是否是解决方案。
我可能仍然会遇到一些我不相称的极端情况,但这绝对是我认为的正确解决方案。