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