如何解释算法创建指令中的蛮力?

时间:2012-02-09 22:56:38

标签: c algorithm

我遇到以下问题的问题是解释蛮力的含义,我相信如果我只是知道它的问题,我可以为这个问题设计代码。 :/

以下是说明:

  

[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个便士。

这种蛮力是什么意思?我理解它是如何找到每种硬币的最大数量,但是如何用它来解决这个人应该得到的每种硬币的数量?

2 个答案:

答案 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。

然后可以检查每个硬币组合以查看它是否是正确的变化量,并且您可以计算硬币的数量以找出哪个组合使用最少的硬币。