C 生成所有组合的回溯算法

C 生成所有组合的回溯算法,c,recursive-backtracking,C,Recursive Backtracking,我有一个小问题。我想生成所有可能的组合。数字位于1D数组中,它是从文件中读取的。现在我不知道问题出在哪里:我知道要打印到监视器上的每个组合都是按升序排列的。问题是,如果它以最小的数字结束,它不会上升到下一个数字 示例: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, 等等 以下是我迄今为止所做的工作: #include <stdio.h> #include

我有一个小问题。我想生成所有可能的组合。数字位于1D数组中,它是从文件中读取的。现在我不知道问题出在哪里:我知道要打印到监视器上的每个组合都是按升序排列的。问题是,如果它以最小的数字结束,它不会上升到下一个数字

示例: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, 等等

以下是我迄今为止所做的工作:

#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");
}
#包括
#包括
作废打印(整数*,整数);
无效组合(int*,int,int,int);
int main()
{
文件*fin=fopen(“bemenet.txt”、“r”);
如果(!fin){printf(“打开文件时出错@!!!”);返回0;}
int*a,i,n,p=3;
fscanf(fin、%i、&n);
a=(int*)malloc(n*sizeof(int));
对于(i=0;i
数字只递增的原因是,你从不递减它们。另外,条件
a[k+1]
对我来说没有任何意义,为什么要将字段的大小与数组的元素(例如1000)进行比较?另外,您不应该将数组中的元素更改为
++a[k+1]
,因为没有理由这样做

例如,见 获取更多帮助。

但是如果我使用ex:for(I=0;I