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

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

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

--点击进入刷题地址 


引言

        ---在算法设计的殿堂中,动态规划无疑是一颗璀璨的明珠。它用巧妙的状态转移思想解决了许多看似棘手的问题。而在力扣(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

四、寄语

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

你可能感兴趣的:(leetcode,动态规划,算法,python,数据结构,职场和发展)