Mark两种计算 全排序问题(全组合问题)的组合和非组合解决方法
1.有排序的全排列(全组合)问题
这个用递归的方式解决
a.取数组n中的最大值
b.再在剩下的n-1个中取m-1个
c.直到取到从n-m+1个数中取出1个为止
d.再取出数组中次大的,重复a步骤,直到取到的数的编号==m
下面贴出C的实现
#include<stdio.h>
#define MAX 5
int FLAG_N = 0;
int a[MAX] = {
1, 2, 3, 4,
5
};
int flag = 0;
void solve(int n, int m, int A[]);
void Display(int A[]);
void main()
{
int n = 0,
help[MAX];
scanf("%d", &n);
FLAG_N = n;
solve(MAX, MAX - n + 1, help);
}
void solve(int n, int m, int A[]){
int i;
for(i = n; i >= m; i--){
A[m - 1] = i - 1;
if(m > 1){
solve(n - 1, m - 1, A);
}else{
Display(A);
}
}
}
void Display(int A[]){
int i;
for(i = 0; i < FLAG_N; i++){
printf("%d ", a[A[i]]);
}printf("\n");
}
2.无排序的全排列问题
该问题笔者打算用01算法实现
解题思路:
注(从m个数中取n个)
a.将辅助数组初始化为全0
b.辅助数组最后的第n位数置为1
c.用二进制计算方法,每次数组最后加一
d.统计该数组中为1的数的个数是否为n
e.如果是的话输出/记录该排序
算法C实现:
#include<stdio.h>
#define MAX 5
int ifGoOn = 1;
int A[MAX] = {
1, 2, 3, 4, 5
};
int help[MAX] = {
0, 0, 0, 0, 0
};
void Display(){
int i;
for(i = 0; i < MAX; i++){
if(1 == help[i]){
printf("%d ", A[i]);
}else{
continue;
}
}printf("\n");
}
void HelpAddOne(){
int i = 0;
help[MAX - 1]++;
for(i = MAX - 1; i >= 0; i--){
if(2 == help[i]){
if(i == 0){
ifGoOn = 0;
return;
}else{
help[i] = 0;
help[i - 1]++;
}
}
}
}
int main()
{
int n, i;
scanf("%d", &n);
{//init:
for(i = n - 1; i < MAX; i++){
help[i] = 1;
}
}
while(1 == ifGoOn){
int sum = 0;
for(i = 0; i < MAX; i++)sum += help[i];
if(sum == n)
Display();
HelpAddOne();
}
}
谢谢欣赏