n代表二进制数字的长度,m代表二进制数字中1的个数,返回所有符合条件的数

//写一个函数,n代表二进制数字的长度,m代表二进制数字中1的个数,返回所有符合条件的数
//例如:m=4,n=2,返回12(1100),10(1010),6(0110),9(1001),5(0101),3(0011)
#include<bits/stdc++.h>
using namespace std;
vector<int> ans;
//方法一
void dfs(int n, int m, int tmp){
    if(m == 0 && n == 0){
        ans.push_back(tmp);
        return;
    }
    if(m < 0 || n < m) return;
    int tmp_ = tmp;
    tmp = ((tmp << 1) | 1);
    dfs(n - 1, m - 1, tmp);
    tmp = tmp_;
    tmp = (tmp << 1);
    dfs(n - 1, m, tmp);
}
//方法二
vector<int> fun(int n,int m){
    //4 2 1100 1010 1001 0110 0011 0101
    //    12   10   9    6    3    5
    if(m==0) return {0};
    else if(m==n) return {((1<<m)-1)};
    else{
        vector<int> v;
        for(int i:fun(n-1,m)) v.push_back(i*2);
        for(int i:fun(n-1,m-1)) v.push_back(i*2+1);
        return v;
    }
}
void print(vector<int>& arr){
    for(auto i : arr){
        cout<< i <<" ";
    }
    cout<<endl;
}

vector<int> fun(int n, int m){
    dfs(n, m, 0);
    return ans;
}
int main(){
    vector<int> vec = fun(4, 2);
    print(vec);
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_24624539/article/details/108519124