//子集生成
#include
#include
#include
#include
#include
#include
using
namespace std;
//快速冪運算
/*巧算 m=1010(利用二進位制)*/
intmypow_4
(int n,
int m)
return result;
}//逐步生成(迭代)
setint>>
getsubset_1
(int arr,
int n)
res = new_res;
//更新大集合
}return res;
}//遞迴解法
//cur表示當前元素的下標
setint>>
getsubset_2
(int arr,
int cur)
setint>> oldset =
getsubset_2
(arr, cur -1)
;//遍歷舊集合的每乙個元素(子集),對於當前的元素(陣列裡的元素),可以選擇加或者不加
for(set<
int> s : oldset)
return newset;
}//二進位制解法(可以按字典序逆序)
listint>>
getsubset_3
(int arr,
int n)
} res.
push_back
(s);
}return res;
}int
main()
; setint>> s =
getsubset_2
(arr,4)
;//如果只要求非空子集,就把大集合中的空集刪除即可
//setempty_set;//新建乙個空集便於刪除結果集合中的空集------刪除方法1
//set>::iterator it = s.begin();//指向第乙個元素(即空集)的迭代器-------刪除方法2
//列印所有的子集
for(set<
int> ss : s)
cout <<
"]"<< endl;
}//二進位制解法
int arr_2[3]
=;listint>> l =
getsubset_3
(arr_2,3)
;for
(list<
int> lis : l)
cout <<
"]"<< endl;
}return0;
}
演算法學習之子集生成問題
在暴力求解演算法中,子集生成問題是乙個很重要的演算法,在乙個陣列中找到各種子集,然後篩選出符合題目條件的子集,比如n sum等問題,現在寫乙個位向量法生成子集的通用模板 include include include include using namespace std visit是乙個標記陣列,...
子集生成演算法
劉汝佳書上的內容 下文提到的集合 其元素預設為0 n 1 n 個 意思就是一次選乙個 放到 裡 include include include include include include include include include include include include includ...
子集生成演算法
子集生成演算法屬於暴力法中一類非常重要的演算法.給定乙個集合,請寫乙個演算法,得到其所有的子集.這裡假定該集合不存在重複的元素.舉個栗子,給定集合 1,2,3 你返回這樣一堆子集 1 2 3 1,2 1,3 2,3 1,2,3 根據離散數學的知識,我們可以知道,乙個長度為n的集合的子集有2n個,集合...