算法:C++排列组合

题目:给定1-n数字,排列组合。

解法:递归。第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出。用数组表示n个数字,用过的数字置0。

实现语言:C++

#include <iostream>
using namespace std;

/************************************************************************/
/*
	num : 需要排列的数组
	count : 数组总数
	numC: 已经排列的数组
	iUse:已经排列的个数
	iNull:置0的个数
	sum: 总排列数
*/
/************************************************************************/
template <class T>
void ComBineNum(T *num, const int count, T *numC, int iUse, int* sum)
{
	int iNull = 0;
	T *newNum = new T[count];
	for (int i = 0; i < count; ++i){
		memcpy(newNum, num, count);
		if (newNum[i] == 0){
			++iNull;
			if (iNull == count){
				for (int i = 0; i < count; ++i){
					cout << numC[i];
				}
				cout << endl;
				++(*sum);
				return;
			}
			continue;
		}
		numC[count - iUse] = newNum[i];
		newNum[i] = 0;
		ComBineNum(newNum, count, numC, iUse - 1, sum);
	}
	delete[] newNum;
}

int main()
{
	int sum = 0;
	const int count = 4;
	char num[count], pNum[count];
	for (int i = 0; i < count; ++i){
		num[i] = i + '1';
	}
	ComBineNum<char>(num, count, pNum, count, &sum);
	cout << "sum :" << sum << endl;

	sum = 1;
	for (int i = 1; i <= count; ++i){
		sum *= i;
	}
	cout << "sum :" << sum << endl;

	return 0;
}

输出:

文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/41516105

时间: 2024-08-27 12:12:31

算法:C++排列组合的相关文章

利用标准库算法求解排列组合

以前求序列的排列时,最常用的方法就是递归回溯,现在发现其实像这样有特定算法的重复性工作是可以在STL标准库中找到答案的. 在STL的变序性算法中,有两个用于排列元素的算法分别如下: bool next_permutation(Iterator beg,Iterator end) bool prev_permutation(Iterator beg,Iterator end) 这两个算法的功能也很简单,next_permutation()会改变区间(beg,end)内的元素次序,使它们符合"下一个

算法笔记 --- 排列组合

排列组合的计算公式

算法联系:排列组合

1. Matrix.java package net.wuhx.main; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Matrix { private String rowText = ""; private int row = 0; private int col = 0; private Point[]

C#的排列组合类

C#的排列组合类 //-----------------------------------------------------------------------------//// 算法:排列组合类//// 版权所有(C) Snowdust// 个人博客    http://blog.csdn.net/snowdust & http://snowdust.cnblogs.com// MSN & Email [email protected]//// 此源代码可免费用于各类软件(含商业软

【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

[题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模924844033.n<=2*10^5. [算法]排列组合+NTT [题解]考虑每个点只会在k个点都在其一个子树时无贡献,即: $$ANS_k=\sum_{x=1}^{n}\binom{n}{k}-\sum_{y}\binom{sz[y]}{k}+\binom{n-sz[y]}{k}$$ 令$cnt_i$表示满足s

STL_算法(17)_排列组合 next_permutation() perv_permutation()

next_permutation() prev_permutation() #include<iostream> #include<algorithm> #include<vector> // 排列组合开始之前一定要先排序 using namespace std; int main() { vector<int> ivec; ivec.push_back(1); ivec.push_back(2); ivec.push_back(3); for (vecto

算法练习:排列组合之子集合

问题描述 输入一个含有不同数字的序列,输出其所有子集合(含空集).要求:1)集合里元素有序排列:2)输出结果不含有重复集合 举例 输入序列{3,1,2} 输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} 问题分析 可以使用排列组合问题求解的第一种方法:分期摊还.初始化时,结果集合里含有一个空集.当扫描数列时,保留原有集合,同时将当前元素插入现有的所在集合中,从而形成新的集合.详见后面代码的GetSubSetsAmortized函数. 也可以使用第二种方法:f

java排列组合算法代码实现

原文:java排列组合算法代码实现 源代码下载地址:http://www.zuidaima.com/share/1550463479024640.htm java排列组合算法,有需要研究的童鞋可以下载,运行结果如下: package com.zuidaima.test; /** *@author www.zuidaima.com **/ public class Pailie { public static void main(String[] args) { int[] ia = {1, 2,

c# 排列组合算法

//排列组合 public class FullArrange { /// <summary> /// 排列组合 /// </summary> /// <param name="str">字符串</param> /// <param name="splitStr">分割的符号,比如";"</param> /// <returns></returns>

迷人的算法-排列组合

需求 最近工作中碰到一个需求:我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇妙”的反应,由于不确定怎么组合,就需要将所有的组合都列出来进行尝试. 抽象一下就是从一个集合中取出任意元素,形成唯一的组合.如 [a,b,c] 可组合为 [a].[b].[c].[ab].[bc].[ac].[abc]. 要求如下: 组合内的元素数大于 0 小于等于 数组大小: 组合内不能有重复元素,如 [aab] 是不符合要求的组合: 组合内元素的位置随意,即 [ab] 和 [ba