//生成1~n的子集
void subset_m(int *data, int n, int cur)//data 必须是有序的
{
for (int i = 0; i < cur; i++)
{
cout << data[i] << ",";
}
cout << endl;
int s = cur?data[cur-1]+1:0; //此处必须是连续数值
for (int i = s; i < n; i++)
{
data[cur] = i;
subset_m(data, n, cur+1);
}
}
void subset_m(int *data, int* out, int n, int cur)//data 必须是有序的
{
for (int i = 0; i < cur; i++)
{
cout << out[i] << ",";
}
cout << endl;
for (int i = cur; i < n; i++)
{
if ((data[i] > out[cur - 1] && cur>=1) || cur == 0)//当前的元素必须比之前的选取的元素大
{
out[cur] = data[i];
subset_m(data, out, n, cur + 1);
}
}
}
//此处是不重复元素
void subset(int *data, int *binary, int n, int cur)//data 数组 的 子集
{
if (cur == n)
{
for (int i = 0; i < n; i++)//每个位置 用0和1标志是否取
{
if (binary[i])
{
cout << data[i] << ",";
}
}
cout << endl;
}
else
{
binary[cur] = 1;//可取时
subset( data, binary, n, cur+1);
binary[cur] = 0;//不可取时
subset( data, binary, n, cur+1);
}
}
//二进制法
//n,n-1,...,0
void print_subset(int n, int s)
{
for (int i = 0; i < n; i++)//n个数
{
if (s&(1 << i)) cout << i;
}
cout << endl;
}
int n = 3;
for (int i = 0; i < (1 << n); i++)//生成二进制标记 子集 0~2^n-1
{
print_subset(n, i);
}
//生成子集
int data_set[] = {5,2,3};
int binary[3] = { 0 };
//subset(data_set, binary, 3, 0);
sort(data_set, data_set + sizeof(data_set) / sizeof(int));
int out[3];
subset_m(data_set, out, 3, 0);//必须有序
//subset_m(data_set, 3, 0);