题目

  • 有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;
    第一步:横向为体积容量,填充的是价值
  • 笔试算法《01背包问题》_算法

  • 第二步:
  • 笔试算法《01背包问题》_数组_02

  • 第三步:
  • 笔试算法《01背包问题》_数据结构_03

  • 第四步:
  • 笔试算法《01背包问题》_动态规划_04

结果就是: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]);
}```