动态规划组成数

225 阅读1分钟
let arr = [
    917784,
    890647,
    403534.35,
    737052,
    787163.67,
    987727.4,
    901810.25,
    1126575.7,
    1037552,
    624930,
    1112400,
    560710
]

/*查找一个数组中哪几个数,可以组合成目标数
 *@method getWhichs
 *@param  {数组}         arr         传入数组
 *@param  {参数类型}      target      目标数
 *@param  {参数类型}      stair       几个数组成
 *@return {数组}  返回由哪几个数相加组成
*/
function getWhichs(arr, target, stair = 2) {
    // 结尾处理,传递一个空数组进来
    if (arr.length === 0) {return []}
    
    // 需要多个数(两个以上)的数处理
    if (stair > 2) {
        let nextArr = getWhichs(arr.slice(1), target - arr[0], stair - 1)
        if (nextArr.length !== 0) {
            nextArr.unshift(arr[0])
            return nextArr
        } else {
            return getWhichs(arr.slice(1), target, stair)
        }
    }

    // 主要逻辑处理:小于两层时,直接搜索一遍,解决长度是1的数组
    if(stair <= 2 && ~arr.indexOf(target) ){return [target]}
    for (let i = 1; i < arr.length; i++) {
        if(arr[0]+arr[i] === target){
            return [arr[0], arr[i]]
        }
    }

    // 递归本函数
    let resArr = getWhichs(arr.slice(1), target)

    // 增加层级
    if (resArr.length === 0) {
        return getWhichs(arr, target, ++stair)
    } else {
        return resArr
    }
}



console.log(getWhichs(arr, 2949017.35))
console.log(getWhichs(arr, 3065937.95))
console.log(getWhichs(arr, 4072931.07))