我没能编写一个函数来生成map std :: map,int>的所有可能组合(n选择k)。
例如:我创建了这个地图,Mymap
(( 1, 2 ), 1)
(( 1, 3 ), 1)
(( 1, 4 ), 1)
(( 2, 3 ), 2)
(( 2, 4 ), 3)
(( 2, 5 ), 1)
(( 3, 4 ), 2)
(( 5, 4 ), 1)
基于Mymap
,我想生成所有可能的组合(n选择k),其中n(1,2,3,4,5),k是子集的大小。
更多详细信息,基于Mymap
,我们可以找到:
1:存在于对(1,2),(1,3)和(1,4)
中这给了我第一组{2,3,4}我想为'1'生成所有可能的组合
如果k = 2那么,'1'的组合是:
1,2,3
1,2,4
1,3,4
具体来说,我想将结果保存在新地图“ Mymap2 ”中,如:
((1,2) (1,3), 2) // number 2 because I add the values for these two pairs (( 1, 2 ), 1) + (( 1, 3 ), 1)
((1,2) (1,4), 2)
((1,3) (1,4), 2)
然后,我为'2'做同样的事情
2:存在于对(1,2),(2,3),(2,4)和(2,5)
中这给了我{1,3,4,5}集,我想为'2'生成所有可能的组合
如果k = 2那么,'2'的组合是:
2,1,3
2,1,4
2,1,5
2,3,4
2,3,5
2,4,5
这个结果,将存储在Mymap2中
((2,1) (2,3), 2)
((2,1) (2,4), 5)
((2,1) (2,5), 2)
((2,3) (2,4), 5)
((2,3) (2,5), 2)
((2,4) (2,5), 4)
并重复相同的步骤,为3,4,5
为了做到这一点,我创建了新的地图(std :: map> Item),其中k值是(1,2,3,4,5),值是关联项的集合
例如,将项映射为:
(1, {2,3,4})
(2, {1,3,4,5})
(3, {1,2,4})
(4, {1,2,3,5})
(5, {2,4})
这是创建'Item'的代码
for (const auto& p1 : Mymap)
{
Item[p1.first.first].push_back(p1.first.second);
Item[p1.first.second].push_back(p1.first.first);
}
它也给了我每组的大小,所以,如果用户设置k = 4,并且我们知道(例如)1与3个项目相关联,我们设置k = 3,
这是我的代码,仅当k> =关联项目数
时才有效例如:如果我们设置k = 3或更高,并且我们想测试=(1,{2,3,4}),这意味着:1与3个项目相关联,那么这个代码输出正确,但是如果k = 2,那么我将得到错误。
仅在以下情况下有效:
int k = 0;
std::map <int, vector <int> > Kcom;
int i = 1;
for (const auto& p1 : Item)
{
k=2;
if (k > Item[p1.first].size())
k = Item[p1.first].size();
int count = 1;
int c = 0;
int j = Item[p1.first].size();
while (c != j)
{
cout << Item[p1.first].size();
cout << "\n";
while (count <= k)
{
Kcom[i].push_back(p1.second[c]);
++c;
++count;
}
++i;
// if j > k then
//-----
count = 1;
}
}
请帮忙。