笔试算法《01背包问题》
原创
©著作权归作者所有:来自51CTO博客作者FelixLHT的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目
- 有N件物品和一个容量为V的背包,第i件物品消耗的容量为Ci, 价值为Wi,求解放入哪些物品可以使得背包中总价值最大?
解题思路
思路:
- 1利用二维数据,构造一个表: dp[i][j]表示将前i件物品装进限重为j的背包可以获得的最大价值, 0<=i<=N, 0<=j<=V
容量数组:V[i] 0<=i<=N
价值数组:W[i] 0<=i<=N - 2 如果 j< Ci dp[i][j]=dp[i-1][j]
- 3 若果 j> Ci dp[i][j]=max(dp[i-1][j],dp[i-1][j-V[i]]+W[i])
- 例如:
容量为10,有个 3,4,6,2四件物品价格分别为2,1,6,4;
第一步:横向为体积容量,填充的是价值 - 第二步:
- 第三步:
- 第四步:
结果就是:dp[N-1][V]=10
代码
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//容量
int W = scanner.nextInt();
//物品体积
int[] N = {0, 2, 3, 4, 5};
//物品对应的价值
int[] V = {0, 3, 4, 5, 6};
int[][] dp = new int[N.length + 1][W + 1];
for (int i = 1; i < N.length; i++) {
for (int j = 1; j <= W; j++) {
if (j < N[i]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - N[i]] + V[i]);
}
}
}
System.out.println(dp[N.length - 1][W]);
}```