c++ 数组的排列子集和组合子集 排列数和组合数计算

c++ 的数组排列子集和组合子集

class Combinatorial{
    //组合
public:
    vector<int> nums;//进行抽样的数组
    vector<vector<int>> result;//保存最后的排列结果
    vector<int> res;//数组中选取组合子集,t会保存到result中

    vector<vector<int>> Combinatorial_Set(vector<int>data,int select_Num){
        if(select_Num>data.size()) cout<<"error!"<<endl;

        nums=data;
        recursion(0,select_Num);
        return result;
    }
//计算组合数
long long Combinatorial_count(int a, int m){
//从m个数中选出a个
int mod = 99997867;

long long res=1;
for(int i=0;i<a;i++){
res*=(m-i);
res%=mod;
}
for(int i=1;i<=a;i++){
res/=i;
}
res%=mod;
return res;
}
private: //递归函数 void recursion(int index,int select_Num){ if(res.size() == select_Num){ //长度为指定长度时,保存到ans后,返回,结束这一次递归  result.push_back(res); for(auto v:res) cout<<v;cout<<endl; return; } for(int i=index;i<nums.size();i++){ res.push_back(nums[i]); recursion(i+1,select_Num); res.pop_back(); //回溯  } } }; class Permutation{ //排列 public: vector<int> nums;//进行抽样的数组 vector<vector<int>> result;//保存最后的排列结果 vector<int> used_Flag; vector<int> res;//数组中选取排列子集  vector<vector<int>> Permutation_Set(vector<int>data,int select_Num){ if(select_Num>data.size()) cout<<"error!"<<endl; used_Flag=vector<int>(data.size(),0); nums=data; recursion(0,select_Num); cout<<result.size()<<endl; return result; } //计算排列数 int Permutation_count(int a, int m){ int res=1; for(int i=0;i<a;i++){ res*=(m-i); } return res; } private: //递归函数 void recursion(int cur_Position,int select_Num){ if(cur_Position==select_Num){ result.push_back(res); for(auto v:res) cout<<v; cout<<endl; return; } for(int i=0;i<nums.size();i++){ //如果当前元素没有被选择 if(used_Flag[i]==0){ res.push_back(nums[i]); used_Flag[i]=1; recursion(cur_Position+1,select_Num);//选择下一位 used_Flag[i]=0; res.pop_back(); } } } };
int main(){
vector<int> nums={1,2,3,4,5};

Combinatorial combinatorial;
combinatorial.Combinatorial_Set(nums,2);

Permutation permutation;
permutation.Permutation_Set(nums,2);
cout<<permutation.Permutation_count(2,5)<<endl;
return 0;
}

原文链接: https://www.cnblogs.com/isYiming/p/12553414.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    c++ 数组的排列子集和组合子集 排列数和组合数计算

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/337058

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午10:59
下一篇 2023年3月1日 下午10:59

相关推荐