- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个函数,探索以数组形式给出的所有可能的数字组合,希望找到加起来达到一定数量的最小数字组,该数字作为参数传递。
这是我一直在做的事情,这似乎适用于某些情况,但并非所有情况;
我选择一个数字,从总和中减去它,然后将新的总和传递给函数,数组的限制完好无损,这使我可以选择重新选择数字,
在第二次调用中,我传递了新的总和,即总和减去当前选择的数字,但我将数组缩小了 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;
}
最佳答案
您可以将您的选择简化为:选择硬币并能够重新选择硬币或不选择硬币(递归将覆盖所有选项)
替换:
res1+=howManyCoins_aux(coins,size,sum-coins[i],chosen);
res2+=howManyCoins_aux(coins,size,sum-coins[i],chosen-1);
与
res1 = howManyCoins_aux(coins, size, sum-coins[i], chosen);
res2 = howManyCoins_aux(coins, size, sum, chosen-1);
如果每种硬币只能选择 1 个:(即 change-making problem )
res1 = howManyCoins_aux(coins, size, sum-coins[i], chosen-1);
res2 = howManyCoins_aux(coins, size, sum, chosen-1);
你的算法有点不清楚,而且我认为有很多重复。您可以摆脱 for 循环,并将您的函数更改为:(未经测试)
int howManyCoins_aux(int *coins, int size, int sum, int chosen, int pos)
{
if (sum == 0) return chosen;
if (sum < 0 || pos == size) return 9999999;
int res1 = 9999999;
if (coins[pos] >= sum)
res1 = howManyCoins_aux(coins, size, sum-coins[pos], chosen+1, pos);
int res2 = howManyCoins_aux(coins, size, sum, chosen, pos+1);
return min(res1, res2);
}
话虽这么说,递归可能不是可行的方法(即使在小型数据集上,它也会花费很长时间)。听起来像 integer programming 。链接中有一些解决该问题的选项。
关于c - 递归函数构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14576746/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!