package com.company;
import java.util.concurrent.locks.Lock;
public class Main {
public static void main(String[] args) {
/*
每种物品只选一次
*/
//物体的体积和价值
int[] c = new int[0];
int[] w = new int[0];
int v = 0;//背包容量
int n = 0;//物体总个数
int[][] f;
//dp[i][j] 表示只考虑前i件物品,恰好放入一个容量为j的背包可以获得的最大价值
int dp[][] = new int[0][];
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= v; j++) {
if (j < c[i]) {
dp[i][j] = dp[i - 1][j];
} else {
//第i个物品不放与放
//dp[i-1][j] 不放,就是上一个物品的价值
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - c[i]] + w[i]);
}
}
}
}
void 简单01背包(int[] c, int[] w, int v, int n) {
/*
优化,每次只是用了[i-1],完全可以使用一维数组代替,之前的不用存
*/
int[] dp = new int[0];
for (int i = 1; i <= n; i++) {
//确保不会出现一个物品被选多次
for (int j = v; j >= 0; j--) {
if (j < c[i]) break;
dp[j] = Math.max(dp[j], dp[j - c[i]] + w[i]);
}
}
System.out.println(dp[v]);
}
}
简单01背包
最新推荐文章于 2021-10-04 20:26:44 发布