PHP:硬币改变拼图

时间:2015-12-21 23:26:11

标签: php coin-change

我正致力于将代码问世作为练习TDD和学习PHPSpec的一种方式。我被困在第17天,这实际上是硬币改变之谜。

  

精灵再次买了太多的蛋酒 - 这次是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;
        });
    }
}

1 个答案:

答案 0 :(得分:1)

使用Available Containers的Array Indices作为组合值。