【发布时间】:2011-06-04 12:14:42
【问题描述】:
我正在使用以下代码解决子集和问题的变体。该问题需要从更大的集合(超集)中生成 11 个整数的子集,并检查它是否与特定值匹配(endsum)。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int endsum = 0, supersetsize = 0, done = 0;
int superset[] = {1,30,10,7,11,27,3,5,6,50,45,32,25,67,13,37,19,52,18,9};
int combo = 0;
int searchForPlayerInArray(int arr[], int player) {
for (int i=0; i<11; i++) {
if (arr[i] == player) {
return 1;
}
}
return 0;
}
int sumOfArray(int arr[]) {
int res = 0;
for (int i=0; i<11; i++) {
res+=arr[i];
}
return res;
}
void printArray(int arr[], int arrSize) {
for (int j=0; j<arrSize; j++) {
printf("%2d ",arr[j]);
}
printf("= %d\n",endsum);
}
void permute(int subset[], int pos, int sspos) {
if (done) { //when a correct solution has been found, stop recursion
return;
}
if (sspos == supersetsize) { // out of possible additions
return;
}
if (pos == 11) { //is the current subset 11 ints long?
int res = sumOfArray(subset);
combo++;
if (res == endsum) { //if the sum of the array matches the wanted sum, print
printArray(subset,11);
done = 1;
}
return;
}
for (int i=sspos; i<supersetsize; i++) {
//assert(pos < 11);
//assert(i+1 <= supersetsize);
subset[pos] = superset[i];
permute(subset,pos+1,i+1);
}
}
int main(void) {
endsum = 110;
supersetsize = 20;
int *arr;
arr = malloc(supersetsize*sizeof(int));
int i;
for (i=0; i<supersetsize; i++) {
arr[i] = 0;
}
permute(arr,0,0);
printf("Combinations: %d",combo);
return 0;
}
虽然此解决方案适用于小型超集 (
编辑:根据大众需求添加的完整源代码。
【问题讨论】:
-
这是 C++ 还是 C 语言?它像 C 一样臭,但从技术上讲,我猜它可能是 C++。
-
这对我来说似乎是标准的子集和。它是否正确?如果是这样,我建议自己做更多的研究。在 StackOverflow 和其他地方有很多关于这个问题的讨论。像骗子一样关闭?
-
@AaronMcDaid 非标准部分是缺少负整数和非零答案。
-
嗯,是的,非零答案可以表示为负数,以便将其表示为标准子集和问题?
标签: c++ c optimization