关于二进制的利用

寻找一个序列的真子集。

x&n == x

其实也是以上类似的原理。遍历的一个序列的所有可能排列。 也就是说有4个元素。 那么对于1个 对于2个 对于3个 对于4个。这样所有的排列情况列举。

比如4个元素。那就是 i = pow(2,5)-1 = 1111;

for(x=1;x<i;x++)

{

  x 就是这种序列。

}

#include<iostream>
#include<set>
#include<map>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;

int lim[25];
int init()
{
    lim[0]=1;
    lim[1]=2;
    for(int i=2;i<=22;i++)
        lim[i]=lim[i-1]*2;
}
// 即用bin就是lim[0] = 1 lim[1] = 10 lim[2] = 100...
int main()
{
    int n,k,s;
    init();
    while(scanf("%d%d%d",&n,&k,&s)&&!(!n&&!k&&!s))
    {
        int res=0;

for(int i=0;i<lim[n];i++) { //即 指定的所有排列。 任意取一个 还是2个 还是怎么的。也就是所谓的真子集。 太机智了。 //这货太聪明了。 int ii=i; int all=0,kk=0; int ans=0; while(ii) { all++;//这个也就是ii位置对应的数字。 (也许我会用数组来存吧。不过貌似不好呢。) if(ii%2==1) //也就是最后的一个数字为1 { kk++; ans+=all; } ii/=2; } if(ans==s&&kk==k) res++; } printf("%d ",res); } return 0; }

这是枚举没有重复的 1~n 也就是 1~n 取嘛

原文地址:https://www.cnblogs.com/Milkor/p/4322620.html