问题标题: 组合数学

0
0
已解决
王梓轩
王梓轩
资深光能
资深光能

我们常常用DFS来做全排列,却未曾想到,没有简单一点的方法吗...
有个函数叫next_permutation(),还有个叫prev_permutation(),前者求上一个排列,后者求下一个排列
他们都是bool 类型,自然放到熟悉的while()里面

->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
全排列(数组)

#include<iostream>
using namespace std;
#include<algorithm>  //为了使用 next_permutation() 函数 
int main()
{
     int a[4]={0,1,2,3};
     while(next_permutation(a+1,a+4)) //全排列函数,对数组中下标为 1 ~ 3 的元素进行全排列 
     {
          for(int i=1;i<=3;i++)
               cout<<a[i]<<" ";
          cout<<endl;
     }
     return 0;
} 

->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
全排列(字符串)

#include<iostream>
using namespace std;
#include<algorithm>  //为了使用 prev_permutation() 函数 
int main()
{
     string s="abc";
     while( prev_permutation( s.begin(),s.end() ) ) 
     {
          cout<<s<<endl; 
     }
     return 0;
} 

->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
字符串按内部排序,数组一样(否则你自己试试)
但可能还有人会问:那组合岂不是不行
俗话说的好:《组合数学碰运气》
这就让我想到了
更简单
就这样:

#include<bits/stdc++.h>
using namespace std;
const int s=1e+006;
int a[s]={0},n,r;
int main()
{
    cin>>n>>r;
    for(int i=1;i<=r;i++)
        a[i]=1;
    do
    {
        for(int i=1;i<=n;i++)if(a[i]!=0)cout<<i<<" ";
        cout<<endl;
    }while(prev_permutation(a+1,a+n+1));
}

但万一有重复元素呢?

不关你事,放心就好。

王梓轩在2023-01-06 12:14:01追加了内容

ctmd,发了两个


0
已采纳
丁梓豪
丁梓豪
新手天翼
新手天翼

你的写法和我的一模一样

0
0
0
陈俊霖
陈俊霖
新手天翼
新手天翼

原来的时间复杂度:O(n!)

现在的时间复杂度:O(n!x n)

0
我要回答