问题标题: 组合数学

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

我们常常用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));
}

但万一有重复元素呢?

不关你事,放心就好。


0
已采纳
刘意阳
刘意阳
初级天翼
初级天翼

我早就知道了

0
刘小川
刘小川
中级天翼
中级天翼

居然如此简单

但我估计不能AC

我要回答