2015-12-21 82 views
1

我正在研究代码的问世,作为练习TDD和学习PHPSpec的一种方式。我被困在第17天,这本质上是硬币改变的难题。PHP:硬币更换难题

精灵们再次买了太多的蛋酒 - 这次是150升。为了将其全部装入冰箱,您需要将其移入较小的容器中。您可以查看可用容器的容量。例如,假设您的容器大小为20,15,10,5和5公升。如果你需要存储装置25升,有四种方式来做到这一点:

  • 15和10
  • 20和5(第5)
  • 20和5(第二个5)
  • 15,5和5

完全填充所有容器,有多少种不同的容器组合可以完全适合所有150升的蛋酒。

这是我的代码。我用上面的例子写了一个测试。每个例子的combinations方法应该返回4,但它返回3.它似乎无法处理这样一个事实,即有多个容量为5升的容器。

有什么建议吗?

<?php 

namespace Day17; 

class Calculator 
{ 
    private $containers = []; 

    public function combinations($total, array $containers) 
    { 
     $combinations = $this->iterate($total, $containers); 
     return count($combinations); 
    } 

    /** 
    * http://stackoverflow.com/questions/12837431/find-combinations-sum-of-elements-in-array-whose-sum-equal-to-a-given-number 
    * 
    * @param $array 
    * @param array $combinations 
    * @param array $temp 
    * @return array 
    */ 
    private function iterate($sum, $array, $combinations = [], $temp = []) 
    { 
     if (count($temp) && !in_array($temp, $combinations)) { 
      $combinations[] = $temp; 
     } 

     $count = count($array); 
     for ($i = 0; $i < $count; $i++) { 

      $copy = $array; 
      $elem = array_splice($copy, $i, 1); 

      if (count($copy) > 0) { 

       $add = array_merge($temp, array($elem[0])); 
       sort($add); 
       $combinations = $this->iterate($sum, $copy, $combinations, $add); 

      } else { 

       $add = array_merge($temp, array($elem[0])); 
       sort($add); 
       if (array_sum($combinations) == $sum) { 
        $combinations[] = $add; 
       } 
      } 
     } 

     return array_filter($combinations, function ($combination) use ($sum) { 
      return array_sum($combination) == $sum; 
     }); 
    } 
} 
+2

TDD中的一个原则是具有容易测试的一小段代码。也许你应该把它分解成小块来缩小问题所在。 – dan08

+0

这个工作适合你吗? – Mike

回答

1

使用可用容器的数组索引作为组合值。