赞
踩
01背包问题是一个经典的动态规划问题,它询问在给定的物品和背包容量下,如何选择物品使得背包中的物品总价值最大,同时保证不超过背包的容量限制。物品不能分割,每个物品只能选择放入或不放入背包。
输入:
输出:
定义状态:
状态转移方程:
初始化条件:
计算顺序:
最终结果:
下面是使用动态规划解决01背包问题的Java代码示例:
public class Knapsack { public static int knapsack(int W, int n, int[] w, int[] v) { int[][] dp = new int[n+1][W+1]; // 初始化dp数组 for (int i = 0; i <= n; i++) { dp[i][0] = 0; } for (int j = 0; j <= W; j++) { dp[0][j] = 0; } // 动态规划填表 for (int i = 1; i <= n; i++) { for (int j = 1; j <= W; j++) { if (j >= w[i-1]) { dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1]); } else { dp[i][j] = dp[i-1][j]; } } } // 返回最大价值 return dp[n][W]; } public static void main(String[] args) { int[] weights = {2, 3, 4, 5}; int[] values = {3, 4, 5, 6}; int capacity = 8; int maxProfit = knapsack(capacity, weights.length, weights, values); System.out.println("The maximum profit is " + maxProfit); } }
在这段代码中,我们使用了一个二维数组 dp
来存储每一步的结果,并通过逐步计算填充这个表格,最终在 dp[n][W]
中得到背包能够装载
的最大价值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。