生成可重集排列

原创 2015年11月18日 11:43:49
//要注意的问题是:p数组一定要事先排好序
#include<iostream>
#include<cstdio>
using namespace std;
int p[5] = {1, 1, 1, 1, 2};
int a[5];

void print_permutation(int n, int* A, int* P, int cur){
	if(cur == n){
		for(int i = 0; i < n; i++) printf("%d", A[i]);
		printf("\n");
	}
	else 
	for(int i = 0; i<n; i++)
	if(!i||P[i]!=P[i-1])//这个if判断的作用就是去掉重复的排列
		 {
			int c1 = 0, c2 = 0;
			for(int j = 0; j < cur; j++) if(A[j] == P[i]) c1++;  //c1是当前元素在已经排好的数组中的个数 
			for(int j = 0; j < n; j++) if(P[j] == P[i]) c2++;   //c2是当前元素在待排数组中的总个数 
			if(c1 < c2){
				A[cur] = P[i];
				print_permutation(n, A, P, cur+1);
			}
				
		}
}
int main() {
	print_permutation(5, a, p, 0);
	return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

生成可重集的排列

  • 2015年06月08日 12:33
  • 1KB
  • 下载

算法--生成可重集排列

在生成1~n的排列一文中,我们获取排列时用了控制不相等来实现让每个数都不重复地出现,所以如果要生成含有重复元素的全排列,对对生成1~n的排列的程序适当修改即可。 首先,把各个元素改成用户输入,输入数组...
  • hhhzua
  • hhhzua
  • 2015年04月05日 19:58
  • 273

递归学习_组合_生成全子集组合排列(不含空集)

生成全子集组合排列(不含空集) Sample Input 4 1 2 3 4 Sample Output 1 12 123 1234 124 13 134 14 2 23 ...

暴力搜索专题小结:全排列及可重集排列生成算法

1~n的全排列 (1)思路:按照递归的思想,初始化集合S中含有1~n所有元素。如果1~n的集合S为空,那么输出全排列;否则从小到大依次考虑每个元素i,在A的末尾添加i后,集合S变为S-{i}。这里我...

排列生成算法

  • 2013年11月23日 19:46
  • 1.12MB
  • 下载

全排列的生成算法

  • 2013年12月23日 10:19
  • 68KB
  • 下载

生成1~n的排列,以及生成可重集的排列

#include using namespace std; void printPermutation(int n, int* A, int cur) { if (cur == n) { // ...

Even 生成排列 算法 C++ 实现

  • 2009年09月05日 22:56
  • 1KB
  • 下载

003-生成排列-归纳法-《算法设计技巧与分析》M.H.A学习笔记

我们来生成1,2,3,...,n的全排列,这里只说两种与归纳法有关的算法,其他的算法还有几个,也有不是递归的算法,这里先不多讲。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:生成可重集排列
举报原因:
原因补充:

(最多只允许输入30个字)