📅  最后修改于: 2023-12-03 15:40:14.387000             🧑  作者: Mango
本题是一个经典的背包问题,可以用动态规划来求解。
有 N 个项目,每个项目有一个重量 wi 和一个不同选择值计数 xi,选择该项目的收益为 wi * xi。需要在限定的总重量 W 内选择若干个项目,使得选择的项目的收益总和最大。
用 dp[i][j] 表示前 i 个项目,总重量不超过 j 的最大收益。
对于第 i 个项目,有选择或不选择两种情况。
综合两种情况,状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + w[i] * x[i])
当总重量为 0,选择的项目收益总和为 0,即 dp[0][j] = 0。
该算法的时间复杂度为 O(NW),其中 N 为项目个数,W 为总重量。
以下为 Python 代码实现:
def maximize_profit(N, W, weights, values):
# 初始化 dp 数组
dp = [[0] * (W+1) for _ in range(N+1)]
# 状态转移
for i in range(1, N+1):
for j in range(1, W+1):
dp[i][j] = dp[i-1][j]
if j >= weights[i-1]:
dp[i][j] = max(dp[i][j], dp[i-1][j-weights[i-1]] + weights[i-1] * values[i-1])
# 返回最大收益
return dp[N][W]
该函数接受四个参数:
以下为使用示例:
N = 3
W = 50
weights = [10, 20, 30]
values = [60, 100, 120]
max_profit = maximize_profit(N, W, weights, values)
print(max_profit) # 输出:240
背包问题是经典的动态规划问题,在实际问题中也经常出现。通过本题的学习,可以更深刻地理解动态规划的思想,同时掌握一个实用的算法。