给定一个值,如100,给定一个数组,从数组中挑选出N个元素,用javascript怎么实现呢

如数组:

var arr = [99.1, 92.2, 60, 50,
           49.5, 45.7, 25.1, 20, 
           17.4, 13, 10, 7, 2.1, 2, 1];

找到和为100的数组元素,或者结果最接近100的组合:

[60,20,10,7,2,1]
阅读 4.3k
4 个回答
    var arr = [99.1, 92.2, 60, 50,
            49.5, 45.7, 25.1, 20,
            17.4, 13, 10, 7, 2.1, 2, 1
        ];
        
    function combinations(array, n) {
    var lists = [],
        M = 1 << array.length;
    for (var i = 1; i < M; ++i) {
        var sublist = array.filter(function(c, k) {
            return i >> k & 1
        });
        if (sublist.reduce(function(p, c) {
                return p + c
            }, 0) === n)
            lists.push(sublist);
    }
    return lists;
}
        
console.log(combinations(arr, 100))
//[[60,20,13,7],[50,20,13,10,7],[49.5,25.1,17.4,7,1],[60,20,10,7,2,1],[49.5,20,17.4,10,2.1,1],[49.5,17.4,13,10,7,2.1,1]]

首先什么是最接近?
手机端回答编写代码不是很方便,就大概说一下思路,当然说的是和为100的思路。
1、用sort排序数组,从大到小排列,比如有十个数字。
2、for循环先拿到第一个数字和100比较,小于100的把数字拿出来,并记录下i值。接着用100减去这个数,得到一个值a,找到i后面的小于等于a的数字,小于接着减,等于则停止判断,或者减完最后一个数字不为0,停止。

01背包问题
用贪心是不能得到最优解的,要用动态规划做

DP + 贪心是没错的,但是不是标准的01背包,因为有小数。这里提供简化版思路但是不能处理小数,要处理成整数再做。

假设你给的数组arr是价值,重量都是1,背包容量不限制这里就设置为arr.length,物品个数也是arr.length,然后DP就好。

最后贪心求出拿了哪几个。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题