【发布时间】:2017-04-18 07:29:07
【问题描述】:
算法需求
我正在尝试编写一个算法来查找数组中所有 k 长度的项目组合,但它还必须在索引 j 之前使用 n 项目,因为我们有很多 (n,j) 对渴望。
示例
使用索引二之前的至少一项(又名
restrictions = {{1,2}})从{1,2,3,4}中查找所有两项组合。这应该导致{{1,2},{1,3},{1,4},{2,3},{2,4}}。使用索引 2 之前的至少一项和索引 4 之前的两项,即
restrictions = {{1,2},{2,4}},查找来自{1,2,3,4,5,6,7}的所有三个项目组合。
进展
我已经找到了从一堆集合中选择一个项目的所有组合。
void add_combinations_to(vector<int> prefix, vector<vector<int>>::iterator start,
vector<vector<int>>::iterator stop, vector<vector<int>>& ret) {
if(start == stop) {ret.push_back(prefix); return;}
for(auto v : *start) {
auto next = prefix;
next.push_back(v);
add_combinations_to(next, start + 1, stop, ret);
}
};
int main() {
vector<vector<int>> v{{1,2},{3,4}};
vector<vector<int>> ret;
vector<int> init{};
add_combinations_to(init, v.begin(), v.end(), ret);
// ret now contains {{1,3},{1,4},{2,3},{2,4}}
}
我觉得有一种方法可以扩展它。现在我需要退后一步,但建议会很好。在大多数情况下,这只是一个
【问题讨论】:
-
看来限制可以简化。对于您的示例 {1,2,3,4,5,6,7},
-
我会使用
std::next_permutation。 -
看来限制可以简化。对于您的示例数据集 ={1,2,3,4,5,6,7},限制 = {{1,2},{2,4}}。限制可以是{{1,2},{(2-1),4}},因为{1,2}假设前2个中至少有一个被使用,所以对于{2,4}只需要使用一项。
-
例2的解是{{1,2,3}, {1,2,4},{1,3,4}, {2,3,4}} ?跨度>
标签: c++ algorithm combinations subset