二進位制列舉子集

2021-09-07 12:38:19 字數 1088 閱讀 6289

利用二進位制的「開關」特性列舉;

詳細為:如果給定集合a大小為n,則想象a = 的每乙個元素相應乙個開關位(0或1),0表示不出現,1表示出現。

當每乙個元素的開關位的值確定時,就得到乙個子集。因此共同擁有2^n-1種情況(全0為空集,這裡不考慮);

我們利用區間[1, 2^n-1],該區間上的每乙個整數相應乙個子集。相應方法是遍歷該整數二進位制表示的每一位。

若該位為1則相應子集中存在相應元素。否則不存在。

#include //二進位制法

using

namespace

std;

void print_subset(int n, int s)

int main(int argc, char

const *ar**)

cf #306 (div. 2) b. preparing olympiad

題意:

給你乙個陣列。求滿足子集的個數:

滿足的條件: 子集中全部元素的和不超過給定的l 和 r ;

最大值-最小值 < x;

**:
#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define clr(a,b) memset(a,b,sizeof a)

int n,l,r,x;

int a[26];

int main()

int m=1

for(int i=0; iint max=-1;

int min=0x3f3f3f3f;

int s=0;

for(int j=0; jif(i&(1

max) max=a[j];

if(a[j]if(s>=l&&s<=r&&max-min>=x) cnt++;

}printf("%d\n",cnt);

}return

0;}

技巧 二進位制法列舉子集

我們來看乙個可以用二進位制列舉的方法解決的題目 話說大詩人李白,一生好飲 幸好他從不開車 一天,他提著酒壺,從家裡出來,酒壺中有酒兩斗 他邊走邊唱 無事街上走,提壺去打酒 逢店加一倍,遇花喝一斗 這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了 請你計算李白...

做實驗 解題報告(二進位制列舉子集)

有一天,你實驗室的老闆給你布置的這樣乙個實驗。首先他拿出了兩個長度為 n 的數列 a 和 b,其中每個 a i 以二進位制表示乙個集 合。例如數字 5 101 2 表示集合 第 i 次實驗會準備乙個小盒子,裡面裝 著集合 a i 所有非空子集的紙條。老闆要求你從中摸出一張紙條,如果滿足你摸出的 紙條...

位運算二進位制列舉子集 李白喝酒

話說大詩人李白,一生好飲。幸好他從不開車。一天,他提著酒壺,從家裡出來,酒壺中有酒兩斗。他邊走邊唱 無事街上走,提壺去打酒。逢店加一倍,遇花喝一斗。這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了。請你計算李白遇到店和花的次序,有多少種可能的方案。我們已知遇...