问题描述: 现有n件物品和一个容量为c的背包。第i件物品的重量是重量为w[i],价值是v[i]。已知对于一件物品必须选择取(用1表示)或者不取(用0表示),且每件物品只能被取一次(这就是“0-1”的含义)。求放置哪些物品进背包,可使这些物品的重量总和不超过背包容量,且价值总和最大。

代码:

import java.util.Scanner;

/**

  • author:wangxue
  • date:2020/7/23 */ // 0-1 背包问题 public class Solution1 { public static int zeroAndOneBag(int[] weights,int[] values,int capacity){ int[][] dp=new int[weights.length+1][capacity+1]; for(int i=1;i<dp.length;i++){ for(int j=1;j<dp[0].length;j++){ if(j>=weights[i-1]) { dp[i][j] = Math.max(values[i-1]+dp[i-1][j-weights[i-1]],dp[i-1][j]); }else{ dp[i][j]=dp[i-1][j]; } } } return dp[weights.length][capacity]; } public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int capacity=scanner.nextInt(); int goods=scanner.nextInt(); int[] weights=new int[goods]; int[] values=new int[goods]; for(int i=0;i<goods;i++){ weights[i]=scanner.nextInt(); values[i]=scanner.nextInt(); } System.out.println(zeroAndOneBag(weights,values,capacity)); } }