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

代码:

import java.util.Scanner;

/**

  • author:wangxue
  • date:2020/7/23
    */
    // 0-1 背包问题
    // https://www.cnblogs.com/skying555/p/11119488.html
    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;ifor(int j=1;jif(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;iweights[i]=scanner.nextInt();
    values[i]=scanner.nextInt();
    }
    System.out.println(zeroAndOneBag(weights,values,capacity));
    }
    }