生成可重集的排列

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int p[100],a[100];
void dfs(int n,int* p,int* a,int pos)//n是元素个数,p是初始元素集合,pos是当前位置,a是目前已经排列的部分
{
if(pos==n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
else for(int i=0;i<n;i++)
{
if(i==0||p[i]!=p[i-1])//只需要检查第一个元素,以及与前一个元素不相同的元素即可,保证不重复
{
int c1=0,c2=0;
for(int j=0;j<pos;j++)//已经排列的元素中p[i]出现的次数
{
if(a[j]==p[i])
c1++;
}
for(int j=0;j<n;j++)//全部元素中p[i]出现的次数
{
if(p[i]==p[j])
c2++;
}
if(c1<c2)
{
a[pos]=p[i];
dfs(n,p,a,pos+1);
}
}

}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i];
sort(p,p+n);
dfs(n,p,a,0);
return 0;
}

其实有一个函数可以直接实现全排列和可重集排列:next_permutation();

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100005;

int main() {
int n;
cin>>n;
int p[maxn]= {0};
for(int i=0; i<n; i++)
cin>>p[i];
sort(p, p+n);
do{
for(int i=0;i<n;i++)
cout<<p[i]<<' ';
cout<<endl;
}while(next_permutation(p,p+n));
return 0;
}

猜你喜欢

转载自www.cnblogs.com/jiuren/p/10638888.html