之前面试碰到一个算法题,自己实现了一版但是效率堪忧,求优化建议[已解决]
题目大概是这样的: 给你一个骰子(6面),可以无限制的投掷,每次投掷点数之和为总点数。
现问,投掷出总点数为20,共有多少种骰子组合。
投掷20次1点算是一种,投18次1点,再投一个2点又算一种。
以下是我的解法,用的递归方式,思路是用树的终端节点到根节点的和为总点数,然后计算有多少个终端节点。
验证了下 总数在,1、2、3、4都是对的,后面的太多没法验证。
现在的缺陷,当数值为50或者比较大的时候,就半天解不出来。
力扣上搜了下相关的题,答案区都是推荐用动态规划解,自己还是没思路,求解。
<?php
/**
* 总点数 total
* 当前总点数 cur_total
* 如果 当前总点数大于 总点数 就退回
*/
class Touzi
{
public $total = 20;
public $num = 0;
function next($num = 0, $cur_total = 0)
{
$cur_total = $cur_total + $num;
if ($cur_total > $this->total) {
return true;
} elseif ($cur_total == $this->total) {
$this->num = $this->num + 1;
return true;
}
for ($i = 1; $i <= 6; $i++) {
if ($this->next($i, $cur_total)) {
break;
};
}
return false;
}
}
$touzi = new Touzi();
$touzi->total = 6;
$touzi->next();
echo "组合数:" . $touzi->num;
推荐文章: