7 二進位制列舉

2021-08-21 20:08:15 字數 1581 閱讀 8133

1, 之前碰到過幾次這種類似的題目,當時自己的第一感覺就是排列組合但是,如果真是排列組合的話

那他的情況是記錄不下來的,就是對於n歌物品選還是不選的的問題,其實坐下來細細想一下的話要麼

選要麼不選,每乙個物品都是有兩種選擇情況,可以用二進位制來表示我們所有的情況,對於有n個物品的

選擇情況是pow(2,n)個,可以裡利用數字的二進位制表示來表示每一種情況,那麼加和就是簡單的相乘

加和;n個物品 :1   4   5   5   6         對應結果

1                1   0   0   0  0              1

2                0   1   0   0  0              4

3                1   1   0   0  0              5

4                0   0   1   0  0              5

2, 還有就是對映的應用如果是數字的總個數並不是很多的話,但是數字的大小是非常的大的話我們

可以對映一下

數字                        根據大小的下標來對映        各自對應的相應操作(用下標作為連線的紐帶)

10000000000                     2                                         

9999999999                      1

3,  還有就是否是會取重複的問題,對應的數字相與如果是是零的話就是不會有重複,否則就是有重複;

#include

#include

#include

#include

#include

using namespace std;

const int nmax = 1e6+10;

long long aa[20],bb[20],a[50],b[nmax],c[nmax],d[nmax];

vector ma[nmax];

int num;

long long num1,num2;

int main()

for(int i=1;i<=m;i++)

sort(bb+1,bb+1+m);

int to=1;

for(int i=1;i<=m;i++)

for(int i=1;i<=to;i++)

long long sum=0;

for(j=0;jint f=0;

for(j=0;j}if(j==num)

ma[f].push_back(i);

}int kk=num;

num=0;

for(int i=0;iint f=0;

for(int j=0;jfor(int k=j+1;kif(f)

}c[num++]=0;

num1=0;

for(int i=0;i}sort(b,b+num1);

num1=unique(b,b+num1)-b;

for(int i=0;ireturn 0;

}

二進位制列舉

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。每個元素限選一次,不能乙個都不選。關於這個題目,我們很容易想到的便是對所有元素進行暴力搜尋,然後進行剪枝便可。下面我將介紹二進位制列舉的思路和流程來巧妙的解決這個問題。對任一數來說,所面臨的問題是取或不取,在二進...