簡體   English   中英

求和邊界的重復排列

[英]Repetitive Permutations with summation bounds

我嘗試通過將值的總和置為界來生成重復數字數組的所有排列。

例; 我有數組{3,4,5,6},邊界是11。

我想生成到達並剛剛超過11的所有重復排列,如下所示:

3 3 3 3 //
3 4 3 3 //
3 3 5 3 //
3 3 3 6 //
3 4 4 3 //
4 4 4 //
6 6 //
6 4 3 //
5 5 5 //
..

因此,基數不必與數組的基數相同。 預先感謝您的幫助

我嘗試從Java代碼進行以下轉換,但還是得到了C ++的錯誤“未處理的異常”:

void permute(int array[], int start[]){
int sum=0;
for (int i=0; i< sizeof(start)/sizeof(start[0]); i++) {
    sum+= start[i];
}
if (sum >= 11) {
     for (int n=0; n< sizeof(start) / sizeof(start[0]); n++)
       cout << start[n] << " ";
       cout << "\n";
    return;
}
for (int i= 0; i < sizeof(array) / sizeof(array[0]) ; i++) {  
    int* newStart = new int[sizeof(start) / sizeof(start[0]) + 1];
    memcpy (newStart, start, sizeof(start) / sizeof(start[0]) + 1); 
    newStart[sizeof(start) / sizeof(start[0])] = array[i];
             permute(array, newStart);
}

}

 void main ()
 {   
  int array[] = {3,4,5,6};
  int newarray[1];
  for (int i=0; i< sizeof(array)/sizeof(array[0]); i++) {
  newarray[0]=array[i];
  permute(array, newarray); 
}
   system("pause");}

另外,我想保留每個成員的所有排列和位置的索引號。 例:

Permutation[1119] = [ 3 3 5 3],
 Member[1119][1] = 3,
 Member[1119][2] = 3 etc.

這不是那么復雜。 因為您對語言要求非常含糊,所以我自由地發明了自己的偽代碼:

function generate(int[] array, int bound, int[] solution, int sum)
    if (sum > bound)
        print solution
    else
        for each elt in array
            generate(array, bound, solution ++ [elt], sum + elt)

並將其稱為

generate([3, 4, 5, 6], 11, [], 0)

這是Java的代碼:

private static boolean checkConstraint(int[] array) {
    int sum=0;
    for (int i=0; i<array.length; i++) {
        sum+= array[i];
    }
            //we found it, print
    if (sum >= 11) {
        System.out.println(Arrays.toString(array));
        return true;
    }
    return false;
}

public static void permute(int[] array, int[] start){
    if (checkConstraint(start)) {
        return;
    }

    for (int i= 0; i < array.length; i++) {
        int[] newStart= Arrays.copyOf(start, start.length + 1);
        newStart[start.length] = array[i];
        permute(array, newStart);
    }
}

public static void main(String[] args) {
    int[] array= {3,4,5,6};
    for (int i=0; i<array.length; i++) {
        permute(array, new int[] {array[i]});
    }
}

暫無
暫無

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

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