本人拿到这道题的初步想法是很愚蠢的,思路如下:使用递归求解,参数有总数k,当前数量n,总和sum,结果集res,分别加longer或shorter,每次判断层级并分别累加sum。当n==k,将sum装入结果集,最后排序。
参考题解解答后,发现自己忽略了显而易见的条件:
1.sum = i*longer + (k-i)*shorter
2.i从0-k循环,结果依次增大
解法一:循环即可
//k不存在,返回空集
if(!k) return [];
//两板相等,结果唯一
if(shorter == longer) return[shorter*k];
const res = [];
//注意终止条件i<=k
for(let i = 0 ; i <= k ; i++){
res.push(i*longer + (k-i)*shorter);
}
return res;
解法二:递归(本质一样,看起来骚一点)
//特殊情况同上
if(!k) return [];
if(shorter == longer) return[shorter*k];
const dfs = function(shorter, longer ,k , i ,res){
//终止条件i>k
if(i>k) return res;
res.push(i*longer + (k-i)*shorter);
//递归调用,i+1
return dfs(shorter, longer,k ,i+1 ,res);
}
return dfs(shorter, longer ,k ,0 ,[]);