DP - 01 背包 java

01背包是dp的一个经典问题,其主要思想是利用一个dp[i][j]的动态数组,代表前i件物品放入容量为j的背包中,使得总的价值最大。自己刚开始学动态规划时,看到01背包当时就蒙了,看到书上的解释和网上的博客后有所明白dp,把中间变量保存,在下次使用时之间使用,用空间换时间的一种思想。

其动态方程为  dp[i][j] = max{ dp[i-1][j], dp[i-1][j - w[i]] + v[i]}

public class Bag01 {
public static void bag(int total, int n, int[] w, int[] v) {
boolean[] visited = new boolean[n+1];
int[][] c = new int[n + 1][total+1];
// 初始化
for (int i = 0; i <= n; i++) {
c[i][0] = 0;
}
for (int i = 0; i < total + 1; i++) {
c[0][i] = 0;
}


// 动态方程
for (int i = 1; i <= n; i++) {
for (int j = 1; j < total+1; j++) {
if (j - w[i] >= 0) {

c[i][j] = Math.max(c[i - 1][j], c[i - 1][j - w[i]] + v[i]);
}else {
c[i][j] = c[i-1][j];
}



}
}
for(int i=1; i<n;i++) {
if(visited[i])
System.out.print(1 + " ");
else{
System.out.print(0 + " ");
}
}
if(visited[n])
System.out.print(1);
else{
System.out.print(0);
}
System.out.println();


for(int i=0;i<c.length;i++) {
for(int j=0;j<c[0].length;j++) {
System.out.print(c[i][j] + " ");
}
System.out.println();
}



System.out.println(c[n][total]);
}


public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int total = sc.nextInt();
int num = sc.nextInt();
int[] weight = new int[num+1];// 每个物品的重量
int[] value = new int[num+1];
for (int i = 1; i <= num; i++) {
weight[i] = sc.nextInt();
}
for (int i = 1; i <= num; i++) {
value[i] = sc.nextInt();
}


bag(total, num, weight, value);


}
}

发布了7 篇原创文章 · 获赞 0 · 访问量 189

猜你喜欢

转载自blog.csdn.net/HY1273383167/article/details/79771853