ACM:二进制枚举

就是计算选择方案数的作用

1<<0=1(0);

1<<1=2(10);

1<<2=4(100);

1<<3=8(1000);

1<<4=16(10000);

...

1<<7=128(10000000);

...

所以说2的n次方-1,二进制位数一定小于等于n,因此不用担心超出判定范围或者不足判定范围

例题:

某君有 nn 个互不相同的正整数,现在他要从这 nn 个正整数之中无重复地选取任意个数,并仅通过加法凑出整数 XX。求某君有多少种不同的方案来凑出整数 XX。

输入格式

第一行,输入两个整数 n,X(1 \leq n \leq 20, 1 \leq X \leq 2000)n,X(1≤n≤20,1≤X≤2000)。

接下来输入 nn 个整数,每个整数不超过 100100。

输出格式

输出一个整数,表示能凑出 XX 的方案数。

样例输入

6 6
1 2 3 4 5 6

样例输出

4
#include <iostream>
using namespace std;
int main()
{
	int n,X;       //n个数,求和X 
	cin>>n>>X;
	int a[n+5];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	int ans=0;      //方案数 
	for(int i=0;i<(1<<n);i++)       //i<<n   2的n次方-1种状态 
	{	
	    int j=0;	
	    int sum=0;
		int t=i;
		while(t)
		{
			if(t&1==1)             //每种状态求和,t&1==1说明选择此项 
			{
				sum=sum+a[j];
			}
			j++;
			t=t>>1;                //右移一位例如1101变为110,作用是判断是否选择此项 
		}
		if(sum==X)
		{
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43678290/article/details/85739194