算法怎么算:贪心算法

简介: 注意:这里是期望最优,而非必定最优。也就是说存在期望落空的情况。而在这种情况下,贪心算法,并非最优解。

总有人在小白面前说:我是搞算法的,不是码农。又或者在想要进阶的时候,有人问你:你懂算法吗?


所有,算法到底是什么?


从目的性来说:它是计算方法,用来达到自己目的的方式。


直白的说:算法 = 数学 + 逻辑 的计算机表达。还不够简单?别急,算法就是通过代码以除去穷举之外的编写逻辑去编写你的代码。


因为他所包含涉及到了很多计算机本行业之外的其他部分,所以算法实际代表着隐形含义:你有更广泛的知识面。这方面的展开不在此阐述。


让我们回归本次的主体:贪婪算法。


贪心算法是一种基于贪心策略的算法,它在每一步选择中都采取当前状态下最优的选择,从而希望最终能够得到全局最优解。


注意:这里是期望最优,而非必定最优。也就是说存在期望落空的情况。而在这种情况下,贪心算法,并非最优解。

但是,贪心,他快啊。


下面是一个简单的贪心算法示例,用于解决背包问题:


#include <iostream> // 引入iostream库,用于输入输出
#include <algorithm> // 引入algorithm库,用于排序
using namespace std; // 使用std命名空间
struct Item { // 定义一个结构体Item,包含每个物品的价值和重量
    int value;
    int weight;
};
bool cmp(Item a, Item b) { // 定义一个比较函数cmp,用于比较每个物品的价值和重量比率
    double r1 = (double)a.value / a.weight; // 计算物品a的价值和重量比率
    double r2 = (double)b.value / b.weight; // 计算物品b的价值和重量比率
    return r1 > r2; // 返回比率较大的物品
}
double fractionalKnapsack(int W, Item arr[], int n) { // 定义一个函数fractionalKnapsack,用于解决背包问题
    sort(arr, arr + n, cmp); // 对物品按照价值和重量比率进行排序
    int curWeight = 0; // 初始化当前背包重量为0
    double finalValue = 0.0; // 初始化最终价值为0
    for (int i = 0; i < n; i++) { // 遍历每个物品
        if (curWeight + arr[i].weight <= W) { // 如果当前背包重量加上物品重量小于等于背包容量
            curWeight += arr[i].weight; // 将物品放入背包中
            finalValue += arr[i].value; // 增加最终价值
        } else { // 如果当前背包重量加上物品重量大于背包容量
            int remain = W - curWeight; // 计算剩余空间
            finalValue += arr[i].value * ((double) remain / arr[i].weight); // 将物品分成一部分放入背包中
            break; // 结束循环
        }
    }
    return finalValue; // 返回最终价值
}
int main() { // 主函数
    int W = 50; // 定义背包容量W
    Item arr[] = {{60, 10}, {100, 20}, {120, 30}}; // 定义物品数组arr
    int n = sizeof(arr) / sizeof(arr[0]); // 计算物品数量
    cout << "Maximum value we can obtain = " // 输出提示信息
         << fractionalKnapsack(W, arr, n); // 调用fractionalKnapsack函数计算最大价值并输出
    return 0; // 返回0表示程序正常结束
}


在这个示例中,我们定义了一个Item结构体,其中包含每个物品的价值和重量。我们还定义了一个cmp函数,用于比较每个物品的价值和重量比率,以便在排序时使用。


fractionalKnapsack函数是我们的贪心算法实现。我们首先按照价值和重量比率对物品进行排序,然后从最高比率的物品开始,将尽可能多的物品放入背包中,直到背包装满为止。如果我们无法将整个物品放入背包中,则将其分成一部分,并将其放入背包中。


在main函数中,我们定义了一个背包容量W和一组物品,然后调用fractionalKnapsack函数来计算我们可以获得的最大价值。

目录
相关文章
|
1月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
53 2
|
6月前
|
算法 C++ Python
数据结构与算法===贪心算法
数据结构与算法===贪心算法
|
2月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
3月前
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
4月前
|
算法
【算法】贪心算法——柠檬水找零
【算法】贪心算法——柠檬水找零
|
4月前
|
算法
【算法】贪心算法简介
【算法】贪心算法简介
107 0
|
5月前
|
算法 Python
Python算法高手进阶指南:分治法、贪心算法、动态规划,掌握它们,算法难题迎刃而解!
【7月更文挑战第10天】探索Python算法的精华:分治法(如归并排序)、贪心策略(如找零钱问题)和动态规划(解复杂问题)。通过示例代码揭示它们如何优化问题解决,提升编程技能。掌握这些策略,攀登技术巅峰。
148 2
|
5月前
|
存储 算法 Python
Python算法界的秘密武器:分治法巧解难题,贪心算法快速决策,动态规划优化未来!
【7月更文挑战第9天】Python中的分治、贪心和动态规划是三大关键算法。分治法将大问题分解为小问题求解,如归并排序;贪心算法每步选局部最优解,不保证全局最优,如找零钱;动态规划存储子问题解求全局最优,如斐波那契数列。选择合适算法能提升编程效率。
75 1
|
5月前
|
存储 算法 大数据
Python算法高手的必修课:深入理解分治法、贪心算法、动态规划,让你的代码更智能!
【7月更文挑战第9天】在Python算法学习中,分治法(如归并排序)将大问题分解为小部分递归解决;贪心算法(如货币找零)在每步选择局部最优解尝试达到全局最优;动态规划(如斐波那契数列)通过存储子问题解避免重复计算,解决重叠子问题。掌握这三种方法能提升代码效率,解决复杂问题。
60 1
|
5月前
|
算法 索引 Python
逆袭算法界!Python分治法、贪心算法、动态规划深度剖析,带你走出算法迷宫!
【7月更文挑战第8天】分治法,如快速排序,将大问题分解并合并解;贪心算法,选择局部最优解,如活动选择;动态规划,利用最优子结构避免重复计算,如斐波那契数列。Python示例展示这些算法如何解决实际问题,助你精通算法,勇闯迷宫。
54 1