用java写一个01背包的模板
时间: 2024-05-05 12:15:50 浏览: 78
以下是Java实现01背包的模板代码:
```
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 物品数量
int m = scanner.nextInt(); // 背包容量
int[] w = new int[n+1]; // 物品重量
int[] v = new int[n+1]; // 物品价值
for (int i = 1; i <= n; i++) {
w[i] = scanner.nextInt();
v[i] = scanner.nextInt();
}
int[][] dp = new int[n+1][m+1]; // dp数组
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (j < w[i]) { // 背包容量不足,不能放入第i个物品
dp[i][j] = dp[i-1][j];
} else { // 可以选择放或不放第i个物品
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
}
}
}
System.out.println(dp[n][m]); // 输出最大价值
scanner.close();
}
}
```
其中,w数组表示物品的重量,v数组表示物品的价值,dp数组表示在前i个物品和容量为j的情况下可以获得的最大价值。dp[i][j]的值可以由以下两种情况转移得到:
1. 不选择第i个物品,那么dp[i][j]的值应该等于dp[i-1][j]。
2. 选择第i个物品,那么dp[i][j]的值应该等于dp[i-1][j-w[i]] + v[i]。
最终的答案就是dp[n][m]。
阅读全文