【发布时间】:2013-01-12 15:50:12
【问题描述】:
我正在尝试编写一个函数来探索所有可能的数字组合,以数组形式给出,希望找到加起来达到一定数量的最小数字组,并将其作为参数传递。
这是我一直在做的事情,这似乎适用于某些但并非所有情况;
我选择一个数字,从总和中减去它,然后将新总和传递给函数,数组的限制保持不变,这让我可以选择重新选择数字,
在第二次调用中,我传递了新的总和,即总和减去当前选择的数字,但我将数组缩小了 1,这意味着我不会再次选择相同的数字。
但是,我意识到我并没有涵盖所有选择,因为无论如何我假设任何数字对于解决方案都是至关重要的,但我不知道要传递哪些参数才能涵盖第三个选项,即不选择数字,这意味着我不会从总和中减去,并且会缩小数组的大小。
您的帮助将不胜感激,顺便说一句,我正在用 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;
}
【问题讨论】:
-
如果您发布一些代码或伪代码会有所帮助。
-
目前有任何代码吗?该算法看起来几乎合理。
-
数字也可以是负数,对吧?
-
一分钟后贴出代码,@cnicuter居然没有,数组都是正数,从最小值到最大值排序。
-
您以最模糊、最不可读、最无效的方式执行此操作是否有原因?一个简单的 for 循环可以很容易地替换这个乱七八糟的函数。
标签: c recursion tail-recursion backtracking