首页 > 试题广场 >

背包问题

[编程题]背包问题
  • 热度指数:4786 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有N件物品和一个容量为V的背包。第i件物品的价值是C[i],重量是W[i]。求解将哪些物品装入背包可使价值总和最大。


输入描述:
输入第一行数 N V (1 <=N <=500) (1<= V <= 10000)

输入 N行 两个数字 代表 C W (1 <= C <= 50000, 1 <= W <=10000)


输出描述:
输出最大价值
示例1

输入

5 10
8 6
10 4
4 2
5 4
5 3

输出

19
示例2

输入

1 1
10 2

输出

0

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();  // n件物品
    int v = sc.nextInt();  // 容量v
    int[] c = new int[n];  // 单件价值
    int[] w = new int[n];  // 单间重量

    for (int i = 0; i < n; i++) {
        c[i] = sc.nextInt();
        w[i] = sc.nextInt();
    }
    //
    int[][] dp = new int[n][v];
    // 初始化第一行
    for (int i = 0; i < v; i++) {
        if (i >= w[0]) {
            dp[0][i] = w[0];
        } else {
            dp[0][i] = 0;
        }
    }

    // 遍历物品
    for (int i = 1; i < n; i++) {
        // 遍历容量
        for (int j = 0; j < v; j++) {
            if (j < w[i]) {
                // 空间不足
                dp[i][j] = dp[i - 1][j];
            } else {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i]] + c[i]);
            }
        }
    }
    System.out.println(dp[n-1][v-1]);

    sc.close();

}
编辑于 2023-12-27 23:57:49 回复(0)