技巧 二進位制列舉

2021-08-15 08:39:07 字數 1136 閱讀 3477

題目:

第一行,輸入兩個整數 n,x(1≤n≤20,1≤x≤2000)n,x(1 \leq n \leq 20, 1 \leq x \leq 2000)n,

x(1≤

n≤20

,1≤x

≤200

0)。接下來輸入 n

n 個整數,每個整數不超過 100100。

輸出乙個整數,表示能湊出 xx

x 的方案數。

方法:二進位制列舉。用乙個enums陣列表示狀態。enum[i]為1就表示取用第i個數,為0就不用。

enums陣列列舉所有狀態時,每次最低位都+1,再按照二進位制進製關係進行調整。取盡所有狀態的條件是不用的第一位為1(取到了所有可以選用的狀態,最低為+1時,所有位都進1)。

如有三個物品,enum有000->001->010->011->100->101->110->111這些狀態。最低為再+1時,為1000,即不用的第一位(第四位)為1。表面所有狀態都列舉過了

#include#define sd(x) scanf("%d",&x)

#define ss(x) scanf("%s",x)

#define sc(x) scanf("%c",&x)

#define sf(x) scanf("%f",&x)

#define slf(x) scanf("%lf",&x)

#define slld(x) scanf("%lld",&x)

#define me(x,b) memset(x,b,sizeof(x))

#define pd(d) printf("%d\n",d);

#define plld(d) printf("%lld\n",d);

// #define reast1npeace

typedef long long ll;

using namespace std;

const int inf = 0x3f3f3f3f;

int enums[25];

int a[25];

int n,x;

bool judge()

memset(enums,0,sizeof(enums));

int ans = 0;

while(enums[n]==0)

} cout<

二進位制列舉

fliptile 乙個反轉問題,大意是一頭牛要反轉木板,木板有黑和白,全部翻成白色的反法 輸出。小蒟蒻根本想不到 參考了大佬的部落格。點此轉入 把第一行的全部翻法都試一遍,然後看哪種的步數最少。好難想。include include int maze 20 20 int t 20 20 int f ...

二進位制列舉

一 二進位制操作 算數字運算 a 60 0011 1100 b 13 0000 1101 1.與 兩個二進位制數,同 1為 1,否則為 0。a b 12 0000 1100 2.或 兩個二進位制數,同 0為 0,否則為 1。a b 61 0011 1101 3.非 按位取反 對二進位制每一位進行了一...

二進位制列舉

讓我們從乙個題目入手 從乙個大小為n的整數集中選取一些元素,使得它們的和等於給定的值t。每個元素限選一次,不能乙個都不選。關於這個題目,我們很容易想到的便是對所有元素進行暴力搜尋,然後進行剪枝便可。下面我將介紹二進位制列舉的思路和流程來巧妙的解決這個問題。對任一數來說,所面臨的問題是取或不取,在二進...