给定一个值,如100,给定一个数组,从数组中挑选出N个元素,用javascript怎么实现呢
迷茫
迷茫 2017-04-11 11:13:05
[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]
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(5)
伊谢尔伦
    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就好。

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号