宿題の一環として、指定された配列に「適切な」サブグループが存在する場合に 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....
に動作する (テスト済み) ことにも言及します。
編集: すぐに投稿する回避策を見つけましたが、他の解決策に非常に興味があるので、お気軽に:)