利用二進位制的「開關」特性列舉;
詳細為:如果給定集合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 次,已知最後一次遇到的是花,他正好把酒喝光了。請你計算李白遇到店和花的次序,有多少種可能的方案。我們已知遇...