高级算法——贪心算法(背包问题)

贪心算法不能用来解决离散物品问题的原因是我们无法将“ 半台电视” 放入背包。 规则是按照物品价值高低顺序放入背包。

    function ksack(values, weights, capacity) {
        var load = 0;
        var i = 0;
        var v = 0;
        while (load < capacity && i < weights.length) {
            if (weights[i] <= (capacity - load)) {
                v += values[i];
                load += weights[i];
            } else {
                var r = (capacity - load) / weights[i];
                v += r * values[i];
                load += weights[i];
            }
            ++i;
        }
        return v;
    }
    var items = [ "A", "B", "C", "D" ];
    var values = [ 50, 140, 60, 60 ];
    var weights = [ 5, 20, 10, 12 ];
    var capacity = 30;
    document.write(ksack(values, weights, capacity)); // 显示 220
时间: 2024-10-14 16:16:11

高级算法——贪心算法(背包问题)的相关文章

五大算法—贪心算法

贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择.必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 二.贪心算法的基本思路: 1.建立数学模型来描述问题. 2.把求解

高级算法——贪心算法(找零问题)

function makeChange(origAmt, coins) {//贪心算法——找零问题 var remainAmt ; if (origAmt % .25 < origAmt) { coins[3] = parseInt(origAmt / .25); remainAmt = origAmt % .25; origAmt = remainAmt; } if (origAmt % .1 < origAmt) { coins[2] = parseInt(origAmt / .1); r

算法-贪心算法

贪心算法大学的时候就已经学过也弄过,可能周末确实没想到写什么,就顺手学了当年学习的知识,贪心算法(也称为贪婪算法),贪心算法总是作出在当前看来最好的选择.贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解. 贪心要素 概念就是这样,如果需要详情可继续搜索获取更多信息,这个时候出现了一个问题,什么使用贪心算法?只需要满足两点即可,首先就是所求解的问题最优

[C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 [适用范围]Dijkstra算法仅适用于[权重为正]的图模型中 时间复杂度 O(n^3) 补充说明 亦可应用于[多源最短路径](推荐:Floyd算法(动态规划,O(n^3))) Dijkstra 时间复杂度:O(n^3) 1.2 算法描述 1.2.1 求解过程(具体思路) 1.2.2 示例 1.2

[C++] 多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS nX Dijkstra算法(贪心算法)

1 Floyd算法 1.1 Code /** * 弗洛伊德(Floyd)算法: 1 解决问题: 多源最短路径问题 求每一对顶点之间的最短路径 Background: 带权有向图 2 算法思想: 动态规划(DP, Dynamic Programming) 3 时间复杂度: O(n^3) */ #include<stdio.h> #include<iostream> using namespace std; // 1 定义图模型(邻接矩阵表示法)的基本存储结构体 # define Ma

数据结构与算法-贪心算法

#include "pch.h" #include <iostream> #include <stdio.h> int main() { const int RMB[] = { 200, 100, 20, 5, 1 }; const int NUM = 5; int X = 628; int count = 0; for (int i = 0; i < NUM; i++) { int use = X / RMB[i]; count += use; X =

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完

五大常用算法之三贪心算法

贪心算法 贪心算法简介: 贪心算法是指:在每一步求解的步骤中,它要求"贪婪"的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解. 贪心算法每一步必须满足一下条件: 1.可行的:即它必须满足问题的约束. 2.局部最优:他是当前步骤中所有可行选择中最佳的局部选择. 3.不可取消:即选择一旦做出,在算法的后面步骤就不可改变了. 贪心算法案例: 1.活动选择问题  这是<算法导论>上的例子,也是一个非常经典的问题.有n个需要在同一天使用同一个教室的活动a

Runnable接口和贪心算法

1 Runnable接口 Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现.设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议.激活的意思是说某个线程已启动并且尚未停止. 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口.实际上,Thread实现了Runnable接口. 2 贪心算法 贪心算法把问题分解为几个有顺序的子问题,逐一对子问题进行求解,每一步都是在已求解子问题的基础上求取最优解,是对已求解部分解的一个扩展,直到