c++ - 具有求和界限的重复排列

标签 c++ c algorithm permutation

我尝试通过对值的总和施加约束来生成所有重复数字数组的排列。

例子; 我有我的数组 {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)

关于c++ - 具有求和界限的重复排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17271546/

相关文章:

c++ - 多维数组逻辑

c++ - 如何在 C++ 中使用带通配符的 DeleteFile

c++ - 如何为 fuse readdir() 正确分配缓冲区?

c++ - 快速排序的实现,几乎可以工作但不能

c - 寻找一个免费且轻量级的HTML解析器

algorithm - 如何将点分成两组 - 轮廓的上部和下部

c - 将 stdout 提供给子进程,该子进程将执行 execv() 排序

python - 从 Python 调用时 C DLL 破解

algorithm - CUDA流压缩算法

algorithm - 生成强连接、均匀分布、随机的有向图