簡體   English   中英

回溯算法以生成所有組合

[英]Backtracking algorithm to generate all combinations

我對此有一點問題,我想生成每種可能的組合。位於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,4 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");
}

數字僅遞增的原因是,您永不遞減。 另外條件a[k+1] < n對我沒有任何意義,為什么還要將字段的大小與數組的元素進行比較(例如可以為1000)? 另外,您也不應將數組中的元素更改為++a[k+1]因為沒有理由這樣做。

參見例如生成列表的所有可能排列的算法? 尋求更多幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM