贪心算法-分数背包问题

贪心算法与分数背包问题详解

目录

贪心算法简介

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。它在有最优子结构的问题中尤为有效。

分数背包问题

与0-1背包问题不同,分数背包问题允许将物品的部分装入背包。这意味着我们可以将一个物品分割成任意大小,并根据其重量比例来计算其价值。

问题分析

  1. 单位价值 :每个物品的单位价值是其价值与重量的比值,即val[i-1] / wgt[i-1]
  2. 贪心选择:按照单位价值从高到低对物品进行排序,然后依次考虑每个物品。

算法步骤

  1. 排序:将所有物品按照单位价值从高到低排序。
  2. 贪心循环 :遍历排序后的物品列表,对于每个物品:
    • 如果物品重量小于等于剩余容量,将整个物品装入背包。
    • 如果物品重量大于剩余容量,只装入能够适应当前容量的部分。

流程图

物品重量小于等于容量 减少背包容量 物品重量大于容量 开始 初始化物品数组 对物品数组进行排序 初始化结果变量res 遍历排序后的物品数组 添加物品价值到res 继续遍历 计算剩余容量能装的价值 添加计算结果到res 结束遍历 返回最大价值res 结束

代码实现(C++)

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Item {
public:
    int w; // 物品重量
    int v; // 物品价值

    Item(int w, int v) : w(w), v(v) {}
};

bool compare(Item a, Item b) {
    return (double)a.v / a.w > (double)b.v / b.w;
}

double greedyFractionBag(vector<int>& wgt, vector<int>& val, int cap) {
    vector<Item> items(wgt.size());
    for (int i = 0; i < wgt.size(); i++) {
        items[i] = Item(wgt[i], val[i]);
    }
    sort(items.begin(), items.end(), compare);

    double res = 0;
    for (auto& item : items) {
        if (item.w <= cap) {
            res += item.v;
            cap -= item.w;
        } else {
            res += (double)item.v / item.w * cap;
            break;
        }
    }
    return res;
}

int main() {
    vector<int> w = {10, 20, 30, 40, 50};
    vector<int> v = {50, 120, 150, 210, 240};
    int c = 50;
    cout << "Maximum value: " << greedyFractionBag(w, v, c) << endl;
    return 0;
}

总结

贪心算法在解决分数背包问题时展示了其高效性。通过合理地排序和贪心选择,我们可以得到一个接近或达到最优解的方案。


C++学习资源

以下是我学习C++觉得不错的资料,仅供学习

匠心精作C++从0到1入门编程-学习编程不再难

链接: https://pan.baidu.com/s/1q7NG28V8IKMDGD7CMTn2Lg?pwd=ZYNB 提取码: ZYNB

第二套、侯捷老师全系列八部曲 - 手把手教你进阶系列

链接: https://pan.baidu.com/s/1AYzdguXzbaVZFw1tY6rYJQ?pwd=ZYNB 提取码: ZYNB

相关推荐
叫我:松哥6 小时前
基于卷积神经网络的人脸情绪识别算法,引入残差连接与SE注意力模块
人工智能·深度学习·神经网络·算法·cnn·迁移学习·图像识别
KaMeidebaby7 小时前
卡梅德生物技术快报|羊驼免疫:分子生物学实战:基于羊驼免疫的重链抗体制备与全流程验证方案
前端·网络·数据库·人工智能·算法·百度
oort1237 小时前
AI+基层治理·智慧政务解决方案——AI民意速办智能助手
大数据·人工智能·算法·政务
渡之7 小时前
GeoBridge 深度解析:语义锚定多视图基础模型,重塑无人机跨视角地理定位
深度学习·算法·动态规划·无人机
一口吃俩胖子7 小时前
【脉宽调制DCDC功率变换学习笔记024】电压反馈补偿和环路增益
笔记·学习·算法
洛水水7 小时前
【力扣100题】80.寻找旋转排序数组中的最小值
数据结构·算法·leetcode
ting94520007 小时前
VC Boom 技术架构与核心算法深度解
人工智能·算法·架构
无限码力8 小时前
美团研发岗 5月9号笔试真题 - 正整数矩阵
算法·美团笔试真题·美团研发岗笔试真题·美团0509笔试真题
Rabitebla8 小时前
C++ 多态详解:从概念到虚表底层原理(代码轰炸)
开发语言·c++
Smilecoc8 小时前
决策树(二):决策树的划分选择
算法·决策树·机器学习