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;
});
}
}
TDD中的一个原则是具有容易测试的一小段代码。也许你应该把它分解成小块来缩小问题所在。 – dan08
这个工作适合你吗? – Mike