心胸决定格局,眼界决定境界...

生成子集

//生成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);

  

posted @ 2019-02-12 12:33  WELEN  阅读(127)  评论(0)    收藏  举报