# 二维费用的背包问题

对于每件物品,具有两种不同的费用,存在两种不同的限制。一般形式是对物品总数的限制。

从一维扩展到二维

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int N, V, M;
        N = scanner.nextInt(); // n个物品
        V = scanner.nextInt(); // 背包总体积
        M = scanner.nextInt(); // 背包总重量
        int[][]f = new int[V+1][M+1];

        for (int i = 0; i < N; i++) { // 枚举物品
            int v = scanner.nextInt();// 单个物品体积
            int w = scanner.nextInt();// 单个物品重量
            int val = scanner.nextInt(); // 单个物品价值
            for (int j = V; j>=v; j--){
                for(int k = M; k>= w; k--){
                    f[j][k] = Math.max(f[j][k], f[j- v][k-w] + val);
                }
            }
        }
        System.out.println(f[V][M]);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26