力扣刷题之旅:高阶篇(二)—— 动态规划的艺术:背包问题

本文介绍了力扣(LeetCode)上的动态规划问题,特别是0/1背包问题,这是一种经典的组合优化问题。文章通过实例解析了如何使用动态规划解决在背包容量限制下,选取物品以最大化价值的算法,并提供了Python解题代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。   

--点击进入刷题地址 


引言

        ---在算法设计的殿堂中,动态规划无疑是一颗璀璨的明珠。它用巧妙的状态转移思想解决了许多看似棘手的问题。而在力扣(LeetCode)这样的在线刷题平台上,背包问题作为动态规划的经典题型,更是吸引了无数算法爱好者的目光。

一、0/1背包问题

  • 0/1背包问题是最基本的背包问题,每种物品只有一个,可以选择放入背包或不放入
  • 背包问题是一类组合优化的NP问题。
  • 给定一组物品,每种物品都有自己的重量和价值,在不超过背包承重限制的前提下,如何选择物品使得背包内物品的总价值最大。 

二、力扣上的0/1背包问题

        在力扣上,我们经常会遇到类似这样的问题:“给定一个整数数组 values 表示物品的价值,和一个整数数组 weights 表示物品的重量,以及一个整数 capacity 表示背包的容量,求在不超过背包容量的前提下,能够放入背包的物品的最大价值。”

三、解题代码

下面是一个使用动态规划解决0/1背包问题的Python代码示例:
def knapsack_01(values, weights, capacity):  
    # 初始化DP数组  
    dp = [[0 for _ in range(capacity + 1)] for _ in range(len(values) + 1)]  
      
    # 遍历物品  
    for i in range(1, len(values) + 1):  
        # 遍历背包容量  
        for j in range(1, capacity + 1):  
            # 如果当前物品可以放入背包  
            if weights[i - 1] <= j:  
                # 比较放入当前物品和不放入当前物品哪种价值更高  
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1])  
            else:  
                # 当前物品不能放入背包,沿用上一个物品时的最大价值  
                dp[i][j] = dp[i - 1][j]  
      
    # 返回最大价值  
    return dp[len(values)][capacity]  
  
# 示例  
values = [60, 100, 120]  
weights = [10, 20, 30]  
capacity = 50  
print(knapsack_01(values, weights, capacity))  # 输出应为 220

四、寄语

  •         新年将至,愿你在力扣的刷题之旅中,如背包问题般不断积累、不断超越,将知识的价值最大化。愿你的算法之树结出丰硕的果实,你的代码之路越走越宽广。
  •         新年快乐,万事如意!愿你在算法的世界里,收获满满的智慧和喜悦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

高菘菘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值