ACM:二進位制列舉
阿新 • • 發佈:2019-01-05
就是計算選擇方案數的作用
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; }