给出一组n
个数字;什么是以降序生成所有可能的k
- 大小子集的代码(减少每个值的总和)?
示例:
Set={9,8,6,2,1}
=> n=5
和k=3
。所以输出是:
[9,8,6]
[9,8,2]
[9,8,1]
[9,6,2]
[9,6,1]
[8,6,2]
[8,6,1]
[9,2,1]
[8,2,1]
[6,2,1]
这是最有效的算法,但具有NP完全复杂度的算法(n
选择k
排列)仍然是答案。
Matlab Code
中的一个一代是实施的首选。或者可以确定其中有序列表的最大大小的解决方案(通过这个,对于更大的n和k,可以使用近似并返回该列表的特定大小而不计算所有可能性。)
注意:
1)请注意此有序列表中[9,2,1]的位置。所以指数排序不是正确的答案
2)这可能是一种Lexicographical order。
答案 0 :(得分:0)
感谢Divakar,Yvon和Luis,这个问题的可能答案之一:
SSC
中有分类集合组合,所以
combs = nchoosek(Set,k);
[~,ind] = sort(sum(combs,2),'descend');
SSC = combs(ind,:);
如果您希望Set
中每个数字数组的索引(具有唯一编号),num_arr
中的SSC
索引使用此代码
for i=1:k
Index(i)=find(SSC(num_arr,j)==Set(1,:));
end
此代码在[1,3,5]
中为[9,6,1]
返回Index
。
更大n
在这种情况下,计算非常耗时甚至是不切实际的。近似可以解决此问题,对于这种情况,您可以通过修改nchoosek.m
中的Matlab
找到第一个任意答案。