首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回溯算法生成所有组合

回溯算法生成所有组合
EN

Stack Overflow用户
提问于 2016-03-28 02:01:17
回答 1查看 1.4K关注 0票数 0

我有一个小问题,我想生成位于一维数组中的每个可能的combination.The数,它是从一个文件中读取的。现在我不知道问题是什么:我知道要打印到显示器的每个组合都是升序的。问题是,如果它以最小的数字结束,它不会上升到下一个数字。

示例: 1,2,3,4,5,n=5,p=3的一维数组文件;可能的组合:

1 2 3,1 2 4,1 2 5,1 3 4,1 3 5,1 4 5,2 3 4,2 3 5,等等

以下是我到目前为止所做的:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

void print(int*,int);
void combination(int*,int,int,int);
int main()
{
    FILE *fin = fopen("bemenet.txt","r");
    if(!fin){printf("Error opening file @!!!");return 0;}
    int *a,i,n,p = 3;
    fscanf(fin,"%i ",&n);
    a = (int*)malloc(n*sizeof(int));
    for(i = 0; i < n; ++i){
        fscanf(fin,"%i ",&a[i]);
    }
    combination(a,n,p,0);

    return 0;
}

void combination(int *a,int n,int p,int k)
{
    int i;
    if(k == p){
        print(a,k);
    }
    else{
        for(a[k + 1] = a[k] + 1 ; a[k+1] < n; ++a[k+1]){
            combination(a,n,p,k+1);
        }
    }
}
void print(int *a,int k)
{
    int i;
    for(i = 0; i < k; ++i){
        printf("%i ",a[i]);
    }
    printf("\n");
}
EN

回答 1

Stack Overflow用户

发布于 2016-03-28 02:12:12

这个数字只递增的原因是,你永远不会递减它们。另外,条件a[k+1] < n对我来说没有任何意义,为什么你要将字段的大小与数组的元素(可以是1000)进行比较?此外,您不应该将数组中的元素更改为++a[k+1],因为没有理由这样做。

有关更多帮助,请参见示例Algorithm to generate all possible permutations of a list?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36250714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档