我想生成一组数字n = 0, 1, 2, ...
的子集
不应该重复使用不同顺序的相同数字,例如2-3-4 = 3-2-4 = 4-2-3 = 4-3-2
e.g。
vector<unsigned int> list = {2,4,6,8,9}
所以子集就像,
n=0 {}
n=1 {2}{4}{6}{8}{9}
n=2 {2,4}{2,6}{2,8}{2,9}{4,6}{4,8}{4,9}{6,8}{6,9}{8,9}
答案 0 :(得分:3)
生成长度等于您的数字的所有二进制数。
3 numbers:
000
001
010
011
100
101
110
111
接下来根据位置选择数字并将它们映射到相应的集合(例如,如果是001,则将其映射为1,对于101,您将其映射到3)。
对于初始集{1,2,3}:
{} ->0
{3} ->1
{2} ->1
{2,3} ->2
{1} ->1
{1,3} ->2
{1,2} ->2
{1,2,3} ->3
我只是给你一个想法,因为这似乎是家庭作业,这不是一个功课解决网站。这应该给你一个起点。
答案 1 :(得分:1)
大多数算法的工作原理是生成所有可能的子集,然后选择你想要的子集[这里是它的长度]。
您可以使用的一个想法是递归。抽象,所以你做功课。
考虑一个给定的集合G = {1,2,3}
,您必须为其找到子集。
保持一组Y = { {} }
开头。
Step 1 : 1 may or may not be there . Y = { {1} , {} } . G = {2,3}
Step 2 : 2 may or may not be there . Y = { {1,2} , {2} , {1} , {} } . G = {3} .
答案直到G != {}
答案 2 :(得分:0)
对于子集,规则是
“至少有两个子集:null和集合本身。所有子集 count总是= 2 ^(n),其中n是元素的数量 集“。
您可以使用recurisve-backtracking来解决此问题。