#include<stdio.h>
#include<stdlib.h>
int main()
{
int cnt=0;
for (int i=0; i<1<<15; i++)
{
int k=2;
int n=0;
int x=i;
int flag=1;
for (int j=1; j<=15; j++)
{
if (x&1)
k*=2;
else
k--;
if (k==0&&x)
{
flag=0;
break;
}
n+=x&1;
x>>=1;
}
if ( n !=5 || (i & (1<<14)) || !flag || k != 0)
continue;
cnt++;
}
printf("%d",cnt);
system("pause");
return 0;
}
算法思路:
该算法采用15位2进制数(如:101010101010101)用1和0的全排列来表示喝酒和买酒。
在 for (int i=0; i<1<<15; i++)中遍历从1到2^15的数。
第23行中的n+=x&1;是用来计算该数的1的个数。