亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js數組拆分問題

js數組拆分問題

繁星coding 2019-03-14 10:14:03
let arrs=[102,233,45,350,130,220,195,240]我想讓arrs拆分出兩組,但是想讓拆分出的兩組數組之和的值盡可能相近,差值越小越好,我自己想法是重新sort,按照從小到大,然后判斷下標分出兩組,奇數一組,偶數一組,或者前兩個最小值和后兩個最大值為一組,中間四個為一組.大家有沒有更好精確的方法,能取出最小差值.
查看完整描述

3 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

把數組中所有元素求和,除以二
用這個值解一個背包問題子集和問題(Subset sum problem)

查看完整回答
反對 回復 2019-04-09
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

“笨”方法


(()=>{

    console.clear();

    let arrs = [102, 233, 45, 350, 130, 220, 195, 240].sort((a,b)=>a - b);

    console.log(arrs, arrs.reduce((a,b)=>a + b, 0));

    

    // 笨方法,窮舉,不過在窮舉時淘汰了一些值。全窮舉需要跑256次,加上閥值了需要196次

    var divideRes = divide(arrs);

    console.log(divideRes, divideRes.reduce((a,b)=>a + b, 0));


    function divide(array) {

        var total = array.reduce((a,b)=>a + b, 0);

        var half = total / 2;

        var min = total;

        var result = [];

        var counter = 0;


        for (let comb of fullCombination(array, half)) {

            var sum = comb.reduce((a,b)=>a + b, 0);

            if (sum > half && sum < min) {

                min = sum;

                result = comb.slice();

            }

            counter += 1;

        }

        // console.log(counter);

        return result;

    }


    function *fullCombination(array, threshold) {

        function *gen(array, prefix) {

            if (array.length === 0) {

                yield prefix;

            } else {

                if (prefix.reduce((a,b)=>a + b, 0) < threshold) {

                    yield*gen(array.slice(1), [...prefix, array[0]]);

                    yield*gen(array.slice(1), [...prefix]);

                }

            }

        }


        yield*gen(array, []);

    }

}

)();

補充一個背包的解法,支持一下


var res = knapsack([102, 233, 45, 350, 130, 220, 195, 240].map(i=>({w: i,b: i})), ([102, 233, 45, 350, 130, 220, 195, 240].reduce((a,b)=>a + b, 0) / 2) << 0);


查看完整回答
反對 回復 2019-04-09
  • 3 回答
  • 0 關注
  • 597 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號