寻找一个序列的真子集。
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 取嘛