1. 程式人生 > >ACM:二進位制列舉

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;
}