| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1997 人关注过本帖
标题:排列组合
只看楼主 加入收藏
纳兰伽香
Rank: 10Rank: 10Rank: 10
来 自:北京
等 级:贵宾
威 望:10
帖 子:426
专家分:1650
注 册:2015-4-5
收藏
得分:0 

风回小院庭芜绿,柳眼春相续
2015-04-07 10:00
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
回复 21楼 纳兰伽香
我想了半天也没找到好的算法
只有从网上找别人现成的代码
稍做整理 放在这里 仅供参考

程序代码:
#include <stdio.h>
#include <stdlib.h>

void prt_num(int *num, int n) {
    int i;

    for(i = 0; i < n; i++)
        if(num[i]) putchar(i + 'a');

    printf("  ");
}

int check(int *num, int n, int m) {
    int i, flag = 0;

    for(i = 0; i < n - m; i++)
        if(num[i]) flag = 1;

    return flag;
}

void comb_num(int *num, int n, int m) {
    int i, j, count;
    prt_num(num, n);

    for(;;) {
        count = 0;

        for(i = 0; i < n - 1; i++) {
            if(num[i] == 1 && num[i + 1] == 0) {
                num[i] = 0;
                num[i + 1] = 1;
                break;
            }

            if(num[i]) count++;
        }

        for(j = 0; j < i; j++) {
            if(j < count) num[j] = 1;

            else num[j] = 0;
        }

        prt_num(num, n);

        if(!check(num, n, m)) break;
    }
}

int main(void) {
    int n, m, *num, i;

    if((scanf("%d %d", &n, &m)) != 2 || m <= 0 || n <= m) return 1;

    if(!(num = malloc(sizeof(int) * n))) return 1;

    for(i = 0; i < n; i++) {
        if(i < m) num[i] = 1;

        else num[i] = 0;
    }

    comb_num(num, n, m);
    puts("");
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-04-07 10:31
纳兰伽香
Rank: 10Rank: 10Rank: 10
来 自:北京
等 级:贵宾
威 望:10
帖 子:426
专家分:1650
注 册:2015-4-5
收藏
得分:0 
回复 22楼 longwu9t
  我一楼给的代码  就是最经典的  你帮我看看怎么调用  我调用不对

风回小院庭芜绿,柳眼春相续
2015-04-07 11:08
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:20 
回复 23楼 纳兰伽香
我真是看不懂你给的代码
又在网上找了一下算法
下面的代码更简洁些

程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void comb(char *s, int n, int m) {
    int i, j, k, t;
    int total = 1 << n;
    char **new = NULL;

    if(!(new = malloc(total * sizeof(char*)))) exit(EXIT_FAILURE);

    for(i = 0; i < total; i++)
        if(!(new[i] = calloc(n + 1, sizeof(char)))) exit(EXIT_FAILURE);

    if(n == 0) return;

    for(i = 1; i < total; i++) {
        for(k = 0, j = 0; j < n; j++) {
            t = i;

            if(t & (1 << j)) {
                new[i][k++] = *(s + j);
            }
        }
    }

    for(i = 1; i < total; i++)
        if(strlen(new[i]) == m)
            printf("%s\t", new[i]);

    for(i = 0; i < total; i++)
        free(new[i]);

    free(new);
}

int main(void) {
    char s[] = "12345";
    int n = strlen(s), m = 3;
    comb(s, n, m);
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-04-07 14:37
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

人生苦短
还是python大法好啊!

[ 本帖最后由 longwu9t 于 2015-4-7 14:58 编辑 ]

Only the Code Tells the Truth             K.I.S.S
2015-04-07 14:56
纳兰伽香
Rank: 10Rank: 10Rank: 10
来 自:北京
等 级:贵宾
威 望:10
帖 子:426
专家分:1650
注 册:2015-4-5
收藏
得分:0 
回复 25楼 longwu9t
你的这个 1 2 3      1 3 2 这在排列组合里面 是同一种啊

风回小院庭芜绿,柳眼春相续
2015-04-07 15:45
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
回复 26楼 纳兰伽香
我在25楼的图中
前一行输出为n=5 m=3全排列
后一行输出为n=5 m=3全组合

你可看清?

Only the Code Tells the Truth             K.I.S.S
2015-04-07 15:52
SunshineGirl
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:129
专家分:131
注 册:2012-3-20
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>

#define N 3
#define M 5

int combination[N+1] = {0};
void recursion(int m, int depth);

int main(void)
{
    recursion(1, 1);
    getchar();
    return 0;
} 

void recursion(int m, int depth)
{
    int i, j, k;

 
    for (i = m; i <= M; i++)
    {
        combination[depth] = i;
  
        if (depth == N)
        {
            for (j = 1; j <= N; j++)
            {
                printf("%d ", combination[j]);
            }
            printf("\n");
        }
        else
        {
            recursion(i+1, depth+1);
        }
    }
}
2015-04-16 12:10
SunshineGirl
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:129
专家分:131
注 册:2012-3-20
收藏
得分:0 
组合算法跟排列算法一样,需要熟悉 深度优先搜索
我给你一个正确的例子,你自己调试代码吧

[ 本帖最后由 SunshineGirl 于 2015-4-16 12:23 编辑 ]
2015-04-16 12:13
纳兰伽香
Rank: 10Rank: 10Rank: 10
来 自:北京
等 级:贵宾
威 望:10
帖 子:426
专家分:1650
注 册:2015-4-5
收藏
得分:0 
回复 29楼 SunshineGirl
!!!看清楚我的要求再说。

风回小院庭芜绿,柳眼春相续
2015-04-16 12:52
快速回复:排列组合
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019300 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved