全排列/全组合问题的两种解决方法

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();
    }
}

谢谢欣赏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值