白话讲解贪心算法,并用C#,java,python等语言实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、python写出贪心算法

二、C#写出贪心算法

三、java写出贪心算法



前言

贪心算法是一种求解最优解的常用算法,它是一种自顶向下的策略,即在每个阶段先求解可行解,再从中选择局部最优解,逐步构造全局最优解。

贪心算法的步骤主要包括以下几个:

  1. 将问题分解成若干个子问题。

  2. 对于每个子问题,设计一个决策策略,选择其中的最优解作为当前的局部最优解。

  3. 合并所有的局部最优解,得到全局最优解。

需要注意的是,贪心算法并不保证求得的是全局最优解,而只能求得某些特定问题的最优解。因此,在使用贪心算法时,必须要仔细分析问题的特点,确保能够得到正确的结果。

如果还不懂,那我再用更简单的语言来解释一下贪心算法。

你去买东西,手里只有一定的钱,而你想买可能很多东西,但你不能买太多了,因为钱不够。那么你怎么办呢?你可以先挑一样你最需要的东西买,然后再挑下一个最需要的东西买,直到你的钱花完了为止。

这个思路就像是贪心算法,它也是一种选择最优解的方法。在解决一个问题时,贪心算法也是选择当前看起来最优的解决方法,直到遇到了不能继续解决的情况为止。这种思路在处理一些问题时可以得到很好的解决效果,但并不是所有问题都适用。


一、python写出贪心算法

我们这里给出一个简单的用Python实现贪心算法的例子,来解决背包问题求解最大价值:

def knapsack(wvlist, capacity):
    # 贪心算法,按物品单位重量的价值从大到小排序,然后依次加入
    wvlist = sorted(wvlist, key=lambda x: x[1]/x[0], reverse=True)
    result = []
    totalvalue = 0
    for i in range(len(wvlist)):
        if capacity >= wvlist[i][0]:
            capacity -= wvlist[i][0]
            totalvalue += wvlist[i][1]
            result.append(wvlist[i])
        else:
            fraction = capacity / wvlist[i][0]
            totalvalue += fraction * wvlist[i][1]
            result.append((wvlist[i][0] * fraction, wvlist[i][1] * fraction))
            break
    return (result, totalvalue)

以上代码是一个简单的背包问题代码,其中wvlist是一个二元元组列表,表示每个物品的重量和价值,capacity表示背包的容量。函数首先按照物品单位重量的价值从大到小排序,然后依次加入,直到达到背包的容量。如果当前物品无法装入背包,则加入其一部分,直到背包装满或物品用完。

需要注意的是,这个例子只是贪心算法的一种应用,实际中贪心算法并不一定能够得到最优解。

二、C#写出贪心算法

以下是一个简单的C#代码实现贪心算法的示例:

using System;

class Program
{
    static void Main(string[] args)
    {
        int[] values = { 60, 100, 120 };
        int[] weights = { 10, 20, 30 };
        int capacity = 50;

        int result = Knapsack(values, weights, capacity);
        Console.WriteLine("Maximum value: " + result);
    }

    static int Knapsack(int[] values, int[] weights, int capacity)
    {
        int n = values.Length;
        int[,] dp = new int[n + 1, capacity + 1];

        // 填充表格
        for (int i = 1; i <= n; i++)
        {
            for (int w = 1; w <= capacity; w++)
            {
                if (weights[i - 1] <= w)
                {
                    dp[i, w] = Math.Max(values[i - 1] + dp[i - 1, w - weights[i - 1]], dp[i - 1, w]);
                }
                else
                {
                    dp[i, w] = dp[i - 1, w];
                }
            }
        }

        return dp[n, capacity];
    }
}

代码中的 Knapsack 函数实现了一个能够处理背包问题的贪心算法。它使用动态规划来求解能够容纳重量为 capacity 的背包所能携带的最大价值。

该算法使用一个二维数组 dp 来保存填充表格的结果。其中,dp[i, w] 表示考虑前 i 个物品,且背包容量为 w 时的最大价值。算法从表格的左上角开始填充,逐行从上往下、逐列从左往右地计算每个单元格的值。

当我们在处理第 i 个物品时,我们将考虑两种情况:

  1. 我们将该物品装入背包:如果该物品的重量未超过当前背包容量 w,则我们可以将其装入,此时该单元格的值为当前物品价值 values[i-1] 加上前 i-1 个物品、背包容量为 w-weights[i-1] 时的最大价值 dp[i-1, w - weights[i - 1]]
  2. 我们不将该物品放入背包:此时该单元格的值等于前 i-1 个物品、背包容量为 w 时的最大价值 dp[i-1, w]

最终,表格的右下角单元格的值即为我们需要求解的结果。

三、java写出贪心算法

public class KnapsackProblem {
    public static void main(String[] args) {
        int[] values = { 60, 100, 120 };
        int[] weights = { 10, 20, 30 };
        int capacity = 50;

        int result = knapsack(values, weights, capacity);
        System.out.println("Maximum value: " + result);
    }

    static int knapsack(int[] values, int[] weights, int capacity) {
        int n = values.length;
        int[][] dp = new int[n + 1][capacity + 1];

        // 填充表格
        for (int i = 1; i <= n; i++) {
            for (int w = 1; w <= capacity; w++) {
                if (weights[i - 1] <= w) {
                    dp[i][w] = Math.max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w]);
                } else {
                    dp[i][w] = dp[i - 1][w];
                }
            }
        }

        return dp[n][capacity];
    }
}

代码中 knapsack 方法实现了一个可以处理背包问题的贪心算法。它使用了动态规划算法,求解在容量为 capacity 的背包中,所能够携带的最大价值。

在该算法中,我们使用一个二维数组 dp 存储填充表格的结果。其中, dp[i][w] 表示考虑前 i 个物品,容量为 w 的背包所能够携带的最大价值。算法从表格的左上角开始填充,逐行从上往下、逐列从左往右地计算每个单元格的值。

当处理第 i 个物品时,考虑两种情况:

  1. 我们将该物品装入背包:如果该物品的重量未超过当前背包容量 w,则我们可以将其装入,此时该单元格的值为当前物品价值 values[i-1] 加上前 i-1 个物品、背包容量为 w-weights[i - 1] 时的最大价值 dp[i-1][w - weights[i - 1]]
  2. 我们不将该物品放入背包:此时该单元格的值等于前 i-1 个物品、背包容量为 w 时的最大价值 dp[i-1][w]

最终,表格的右下角单元格的值即为我们需要求解的结果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2023大表舅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值