函数 MinimizeMaxProcessingTime(tasks)
n = length(tasks)
total_time = sum(tasks)
half_time = total_time // 2
// 初始化 dp 数组
dp = array of size (half_time + 1) with all false
dp[0] = true
// 动态规划填表
for i = 0 to n - 1 do
for j = half_time down to tasks[i] do
dp[j] = dp[j] or dp[j - tasks[i]]
// 找到最大可行的 j,使得 dp[j] 为 true
for j = half_time down to 0 do
if dp[j] == true then
best_time = j
break
// 计算结果
min_time = max(best_time, total_time - best_time)
return min_time
输入: 作业数组 tasks,每个作业有加工时间 t(i) 和效益值 v(i),以及最大允许时间 D
输出: 最大总效益值
定义:
dp = 一维数组,大小为 D+1,初始化为 0
过程:
for i 从 1 到 n:
for j 从 D 到 t(i):
dp[j] = max(dp[j], dp[j - t(i)] + v(i))
返回 dp[D]
// 三维的0-1背包问题
// dp[w][v]=max(dp[w][v],dp[w−wi][v−ci]+vi)
输入: 物品数组 items,每个物品有重量 w_i、体积 c_i 和价值 v_i,以及最大重量 W 和最大体积 V
输出: 最大总价值
定义:
dp = 二维数组,大小为 W+1 x V+1,初始化为 0
过程:
for i 从 1 到 n:
for j 从 W 到 w_i:
for k 从 V 到 c_i:
dp[j][k] = max(dp[j][k], dp[j - w_i][k - c_i] + v_i)
返回 dp[W][V]
输入: 下载请求带宽数组 a[n] 和最大带宽 K
输出: 子集 S 使得带宽利用最大
定义:
dp = 一维数组,大小为 K+1,初始化为 0
过程:
for i 从 1 到 n:
for j 从 K 到 a[i]:
dp[j] = max(dp[j], dp[j - a[i]] + a[i])
返回 K - dp[K]