我遇到以下问题的问题是解释蛮力的含义,我相信如果我只是知道它的问题,我可以为这个问题设计代码。 :/
以下是说明:
[15分]如果他/她没有,那么程序员可能会在分配3中做出改变的问题提出什么样的解决方案 知道贪心算法吗?解决这个问题的一种可能方法 问题是详尽的搜索,或蛮力的方法。在这 方法,我们测试所有可能的答案,并比较那些 对给定问题的正确解决方案,以找到最佳 答案。
特别是对于标记变更的问题,给予现金 以美分为单位,我们可以先了解任何改变方式 正确(不一定使用尽可能少的硬币), 我们可以使用的最大数量的toonies,loonies等。我们可以 执行六级循环以迭代所有可能的组合 硬币,使用之前计算的最大数字作为上限 对于任何解决方案中的相应硬币。更确切地说,在 最外层循环,我们迭代使用1 toonie,2的解决方案 toonies,...,计算的最大toonies数。在第二 最外层循环,我们迭代使用1个loonie,2个loonies的解决方案, ...,计算的最大数量的懒洋洋(inonies的数量) 这些解决方案在最外层循环中确定,等等。在 最内层的循环,对于每个解决方案,我们检查它是否是一个 给定现金金额的正确解决方案。如果是,那么我们检查 它是否使用的硬币少于我们所有正确的解决方案 到目前为止已见过。
例如,如果现金金额是200,那么我们可以 最多使用1个toonie,2个loonies,8个季度,20个角钱,40个镍币和 在任何解决方案中都有200便士。然后我们检查以下解决方案 (每个解决方案包含6个数字,即硬币的数量 eachtypeused,startingfromtoonies): 0,0,0,0,0,0; 0,0,0,0,0,1; 0,0,0,0,0,2; ...,0,0,0,0,0,200; 0,0,0, 0,1,0; 0,0,0,0,1,1; 0,0,0,0,0,1,2,...,0,0,0,0,1, 200; 0,0,0,0,2,0; 0,0,0,0,2,1; ....在这个特别的 例如,我们测试的任何解决方案都应该使用不超过1个toonie,2 loonies,8个季度,20角钱,40个镍币和200个便士。
这种蛮力是什么意思?我理解它是如何找到每种硬币的最大数量,但是如何用它来解决这个人应该得到的每种硬币的数量?
答案 0 :(得分:4)
蛮力解决方案意味着尝试所有可能的解决方案。对于许多问题,尝试所有解决方案都非常昂贵。它被称为蛮力,因为它不需要对问题有任何特殊的洞察力。
例如,如果您正在选择锁定,那么强力解决方案可能会使每个键成为可能,并尝试全部。当然,这需要很长时间。
您可以在此维基百科关于brute force search的文章中阅读更多内容。
如果没有你的作业中的原始问题描述,很难详细描述蛮力解决方案 - 但我会尝试。对于200现金,一般程序是生成最多200现金的所有可能硬币组合,并检查它们的正确性。
如果您的问题是肯定/没有问题(解决方案成功或不成功),您只需要一个答案。一旦找到解决方案,你就可以停下来。如果您的问题涉及某种分数(例如,旅行商问题),并且您想要最佳答案,那么强力搜索需要尝试所有解决方案,以确保它具有最佳答案。
您通常会将蛮力应用于问题的特定实例 - 例如,您的问题的特定实例是“200现金”,然后您生成所有可能的解决方案仅200现金。下次,当您的问题是“10现金”时,您将生成并测试10个现金问题的所有解决方案。请记住,蛮力并不是生成解决方案的有效方式 - 但对于可以强暴的问题,您可以保证在强制完成后您找到了最佳答案
请注意,大多数问题都有更有效的方法来生成最优解决方案(例如,对于旅行商类型问题,分支机构的性能会超过蛮力)。
最后一段是说,如果您知道最高现金金额,您可以确保您不会生成或测试能够为您提供超过200现金的解决方案。一个简单的方法是用200现金计算出有多少套卡,然后不生成任何使用超过该数量的解决方案。
绑定您的一代解决方案的更好方法是为逐渐变小的硬币设置数字,以确保您总是加起来适量的现金:
for(0 to (cash % valueof(toonies)) as t) {
set cash_after_toonies to be (cash - valueof(t * toonies))
for(0 to (cash_after_toonies % valueof(loonies)) as l) {
set cash_after_loonies to be (cash_after_toonies - valueof(l * loonies))
for(0 to (cash_after_loonies % valueof(quarters)) as q) {
set cash_after_quarters to be (cash_after_loonies - valueof(q * quarters)
for(0 to (cash_after_quarters % valueof(dimes)) as d) {
set cash_after_dimes to be (cash_after_quarters - valueof(d * dimes))
for(0 to (cash_after_dimes % valueof(nickels)) as n) {
set cash_after_nickels to be (cash_after_dimes - valueof(n * nickels))
set p = cash_after_nickels in pennies
check_for_correctness(l,t,q,d,n,p);
}
}
}
}
}
答案 1 :(得分:2)
蛮力方法尝试所有可能的解决方案,以查看哪些是正确的。例如,通过暴力破解密码将尝试AAAAAA,AAAAAB,......等等。
在您的示例中,他要求您尝试所有可能的硬币组合以获得正确的更改解决方案。唯一棘手的部分是他说你应该永远不会拥有任何一枚硬币,而不是只使用那枚硬币进行改变。
例如,你不需要尝试(2个太多,.....)改变一个200%的账单,因为你知道最多可以有1个toonie。
然后可以检查每个硬币组合以查看它是否是正确的变化量,并且您可以计算硬币的数量以找出哪个组合使用最少的硬币。