作为家庭作业的一部分,我需要编写一个函数,如果给定的数组中存在“好”子组,则返回 true。“好子组”是每个组成员中特定字段(整数)的总和大于给定目标(特别是数组原始长度的一半)的子组,并且每个组成员小组与小组的所有其他成员“相处”。如果 2 个成员“相处融洽” (abs(m1->f1 - m2->f1) + abs(m1->f2 - m2-f2)) <= given_hatred
。这是我到目前为止尝试过的,但似乎不起作用:
//-----helpers-----
//checks if the new candiate member likes the others
static bool fits(Member* a,int curr,int chosen[],double get_along)
{
for(int i=0; i<curr;i++)
{
if(chosen[i]==1)
{
int iA=memberGetGAFactorA(a[i]);
int iB=memberGetGAFactorB(a[i]);
int currA=memberGetGAFactorA(a[curr]);
int currB=memberGetGAFactorB(a[curr]);
if(abs_f(iA-currA)+abs_f(iB-currB)>get_along)
return false;
}
}
return true;
}
//backtracking
static bool subsum(Members* a, int n, int size, int sum, int chosen[], int curr, double get_allong)
{
if(sum > size)
return true;
if(n <= 0)
return false;
if(fits(arr,curr,chosen,get_along))
{
chosen[curr]=1;
int inSum = sum+memberGetFieldNum(a[0]);
if (subsum(a+1, n-1, size - memberGetFieldNum(a[0]), inSum, chosen, curr + 1, get_along))
return true;
}
chosen [curr] = 0;
return subsum(a+1,n-1,size,sum,chosen,curr+1,get_along);
}
//------the wanted function-------
bool subGroupExists(Members* array,length, double get_along)
{
int* chosen = calloc(length,sizeof(int));
bool res = subsum(array,length,length/2,0,chosen,0,get_along);
free(chosen);
return res;
}
我还要提到 Member 是一种抽象数据类型,它实现了所有以开头的函数,member....
并且工作正常(经过测试)。
编辑: 我找到了一个解决方法,我很快就会发布,但我对其他解决方案非常感兴趣,所以请随意:)