现在的位置: 首页 > 综合 > 正文

7.3.3(状态压缩求子集生成)

2013年08月10日 ⁄ 综合 ⁄ 共 598字 ⁄ 字号 评论关闭

用到的是状态压缩,一直想学状态压缩的..

姥姥滴.老是学不会.

这次是懂了百分之80%

知道了为什么用&了...

是这样的,

把你要生成子集的数,

按照

a0 a1 a2 a3

0   0   0   0  //  状态栏

1  3   5  6   // 数组拦

出现1的时候就输出对应的书阻拦的数就可以了.

爱情保卫战,怎么那么搞笑- -#

贴出代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>

/*
这就是传说的状态压缩..FUCK..

a0 a1 a2 a3 a4 // 数组序号 
0  0  0  0  0  // 数组的状态(只有1和0) 
1  5  7  8  10 // 数组值 

然后通过 0 代表没有选, 1 代表原则上;
则可以ok
*/ 

using namespace std;

const int maxn = 1111;

int a[maxn];

void Print_subset(int n, int s)
{
	for (int i = 0; i < n; i++)
	{
		if (s & (1 << i))
		{
			printf("%d", a[i]);
		}
	}
	cout << endl;
}

int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &a[i]);
		}
		for (int i = 0; i < (1 << n); i++)
		{
			Print_subset(n, i);
		}
	}
	system("pause");
	return 0;
}

抱歉!评论已关闭.