子集枚举

Posted guaguastandup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子集枚举相关的知识,希望对你有一定的参考价值。

发现了一个很好玩的

可以枚举所有点对

1 for(int i=0;i<n;i++)
2     for(int S=0;S<(1<<n);S++){
3         d[i][S]=INF;
4         for(int j=0;j<i;j++)
5             if(S&(1<<j)
6                 dp[i][S]=max(dp[i][S],dist(i,j)+dp[i-1][S^(1<<i)^(1<<j)];
7     }

 S表示状态,i和j表示不同的点,并且i和j的枚举不会重复,因为保证了j<i

对于每一个i

都有1<<n个S可以枚举

例如n=6

状态可以是:

000000

000001

000011

000111

010101

.......

1111111

S^(1<<i)^(1<<j)表示i,j不在该集合内

S&(1<<i)==true  表示第i位元素存在

 

以上是关于子集枚举的主要内容,如果未能解决你的问题,请参考以下文章

UVA11464 Even Parity(枚举子集)

枚举子集&高位前缀和

子集枚举好题UVA1354

子集的生成—二进制枚举

[SDOI2013]泉

7.1 深搜-子集和问题 (枚举子集+剪枝)