我正致力于将代码问世作为练习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;
});
}
}
答案 0 :(得分:1)
使用Available Containers的Array Indices作为组合值。