二進位制列舉模版
阿新 • • 發佈:2022-12-03
模擬寫法
列舉子集
#include<bits/stdc++.h> using namespace std; int main() { int n; int b[100]; cin>>n; for(int i=0; i<=n; i++)b[i]=0; while(b[0]==0){ for(int i=1; i<=n; i++)cout<<b[i]; cout<<"\n"; int j=n; while(b[j]==1) j--; b[j]++; for(int i=j+1; i<=n; i++)b[i]=0; } return 0; }
組合輸出
#include<bits/stdc++.h> using namespace std; int main() { int n, r; int b[100]; cin>>n>>r; for(int i=1; i<=n; i++)b[i]=i; b[0]=-1; while(b[0]==-1){ for(int i=1; i<=r; i++)cout<<b[i]<<" "; cout<<"\n"; int j=r; while(b[j]==n-r+j)j--; b[j]++; for(int i=j+1; i<=r; i++)b[i]=b[i-1]+1; } return 0; }
位運算寫法
列舉子集
#include<bits/stdc++.h> using namespace std; int a[10]; void print_subset(int n) { for(int i=0; i<(1<<n); i++){ for(int j=0; j<n; j++) if(i&(1<<j)) cout<<a[j]<<" "; cout<<endl; } } int main() { int n; cin>>n; for(int i=0; i<n; i++)a[i]=i+1;//初始化陣列 print_subset(n); return 0; }
組合輸出
#include<bits/stdc++.h>
using namespace std;
int a[10];
void print_subset(int n, int m)
{
for(int i=0; i<(1<<n); i++){
int num=0, kk=i;//num統計i中1的個數;kk用來處理i
while(kk){
kk=kk&(kk-1);//清除kk中的最後一個1
num++;//統計1的個數
}
if(num==m){//二進位制數中的1有k個,符合條件
for(int j=0; j<n; j++)
if(i&(1<<j))
cout<<a[j]<<" ";
cout<<endl;
}
}
}
int main()
{
int n, m;
cin>>n>>m;
for(int i=0; i<n; i++)a[i]=i+1;//初始化陣列
print_subset(n, m);
return 0;
}