【发布时间】:2017-05-12 02:26:03
【问题描述】:
前段时间我写了一个程序,打印给定数组的所有可能排列,甚至打印所有部分数组:
#define MAXARRAY 32
#include <stdio.h>
void combinations(int array[], int temp[], int start, int end, int index, int r);
void print_combinations(int array[], int n, int r){
int temp[r];
combinations(array, temp, 0, n-1, 0, r);
}
void combinations(int array[], int temp[], int start, int end, int index, int r){
if (index == r){
for (int j=0; j<r; j++)
printf("%d ", temp[j]);
printf("\n");
return;
}
for (int i=start; i<=end && end-i+1 >= r-index; i++){
temp[index] = array[i];
combinations(array, temp, i+1, end, index+1, r);
}
}
int main(){
int array[MAXARRAY];
int r;
int n = sizeof(array)/sizeof(array[0]);
int i=MAXarray, j;
for(j=0;j<MAXARRAY;j++){
array[j]=j+1;
}
for(r=0;r<=i;r++)
print_combinations(array, n, r);
}
现在我正在尝试将此程序转换为执行以下操作:
我不想打印排列,而是想对所有排列求和并将总和与固定值进行比较,如果排列中的数字总和确实等于该固定值,它最终会增加计数器我可以检查有多少排列总和等于该值。这是我现在想出的:
#define MAXARRAY 32
#include <stdio.h>
int combinations (int array[], int temp[], int start, int end, int index, int r);
void print_combinations (int array[], int n, int r){
int temp[r];
combinations(array, temp, 0, n-1, 0, r);
}
int combinations (int array[], int temp[], int start, int end, int index, int r){
int sum=0, counter=0;
if (index == r) {
for (int j=0; j<r; j++){
sum=sum+temp[j];
}
if(sum==264){
counter++;
}
}
for (int i=start; i<=end && end-i+1 >= r-index; i++){
temp[index] = array[i];
combinations(array, temp, i+1, end, index+1, r);
}
return counter;
}
int main()
{
int array[MAXARRAY];
int r;
int n = sizeof(array)/sizeof(array[0]);
int i=MAXARRAY, j;
for(j=0;j<MAXARRAY;j++){
array[j]=j+1;
}
for(r=0;r<=i;r++)
print_combinations(array, n, r);
我不知道如何正确更改它以获得我想要的东西,确切地说,我对如何切换 void 函数以打印未出现在函数中的计数器有点迷茫,我不确定是否我可以轻松地“修改”这段代码以获得我想要的,或者我只需要编写全新的函数。
【问题讨论】:
-
我不明白,如果您编写的代码可以计算所有排列,则无需转换任何内容。只计算每个排列的总和?
-
为了澄清,首先代码打印所有排列。我需要第二个代码来计算所有先前打印的排列的总和。
-
举第二个例子...
-
请提供有关输入数据和限制的更多信息,这似乎是适用于 N 而非 N 的非递归任务!
-
输入是从1到32的一系列数字,(1,2,3,4...31,32) 没有限制,根本不需要高效,我只需要一个一次性的答案。它不会在任何更大的程序中运行(目前)。
标签: c recursion permutation