У меня есть два набора в amp для реализации на c ++, набор NS и набор S.
Но я не очень хорошо разбираюсь в множестве S.
set N ordered := {1..n};
set NS ordered := 1..(2**n-1);
set S {s in NS} := {i in N: (s div 2**(ord(i)-1)) mod 2 = 1};
Если n = 4, у меня будет:
set N := 1 2 3 4
set NS := 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15;
set S[1] := 1;
set S[2] := 2;
set S[3] := 1 2;
set S[4] := 3;
set S[5] := 1 3;
set S[6] := 2 3;
set S[7] := 1 2 3;
set S[8] := 4;
set S[9] := 1 4;
set S[10] := 2 4;
set S[11] := 1 2 4;
set S[12] := 3 4;
set S[13] := 1 3 4;
set S[14] := 2 3 4;
set S[15] := 1 2 3 4;
Первый набор может быть легко создан.
vector <int> NS;
int auxMax = pow(2,n)-1;
for (int i = 0; i < auxMax; i++) {
NS.push_back(i);
}
Хотя я знаю, как работают операторы div (возвращает усеченное частное, когда его левый операнд делится на его правый операнд), mod (вычисляет остаток) и ord (возвращает числовую позицию [i] в наборе N) Я не могу создать структуру "for" для набора S.
Может кто-нибудь помочь мне понять генерацию множества S и преобразовать его в вектор в c ++?
Спасибо!