我正在尝试编写一个函数来探索所有可能的数字组合,以数组形式给出,希望找到加起来达到一定数量的最小数字组,并将其作为参数传递。
这是我一直在做的事情,这似乎适用于某些但并非所有情况;
我选择一个数字,从总和中减去它,然后将新总和传递给函数,数组的限制保持不变,这让我可以选择重新选择数字,
在第二次调用中我传递新总和,即总和减去当前选择的数字,但我将数组缩小一,这意味着我不会再次选择相同的数字。
但是,我意识到我并没有涵盖所有选择,因为无论如何我假设任何数字对于解决方案都是至关重要的,但我不知道要传递哪些参数才能涵盖第三个选项,这不是选择数字,这意味着我不会从 sum 中减去,并缩小数组的大小。
您的帮助将不胜感激,顺便说一句,我正在用 C 语言编写。
int howManyCoins(int*coins,int size,int sum)
{
return howManyCoins_aux(coins,size,sum,size-1);
}
int howManyCoins_aux(int*coins,int size, int sum,int chosen)
{
if (sum==0)return 1;
if (sum<0)return 0;
if (chosen==0) return 0;
if (coins[chosen]>sum) return 0;
int res1=0,res2=0,best_solution=0;
for (int i=chosen;i>=0;i--)
{
res1+=howManyCoins_aux(coins,size,sum-coins[i],chosen);
res2+=howManyCoins_aux(coins,size,sum-coins[i],chosen-1);
if(!(res1+res2)) best_solution=0;
else if (res1==0) best_solution=res2;
else if (res2==0) best_solution=res1;
else best_solution=res2>res1?res1:res2;
}
return best_solution;
}