通天之分组背包 Java

通天之分组背包 Java_第1张图片

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int m = Integer.parseInt(st.nextToken());
		int n = Integer.parseInt(st.nextToken());
		int[][] a = new int[101][n + 1];
		int[][] b = new int[101][n + 1];
		int[] p = new int[n + 1]; // 存放第i个小组的物品数
		int maxGroups = 0;
		for (int i = 1; i <= n; i++) {
			st = new StringTokenizer(br.readLine());
			int aa = Integer.parseInt(st.nextToken()); // 重量
			int bb = Integer.parseInt(st.nextToken()); // 价值
			int cc = Integer.parseInt(st.nextToken()); // 组数
			p[cc]++;
			maxGroups = Math.max(maxGroups, cc); // 得出最大组数
			a[cc][p[cc]] = aa;
			b[cc][p[cc]] = bb;
		}
		int[] dp = new int[m + 1];
		for (int i = 1; i <= maxGroups; i++) {
			for (int j = m; j >= 1; j--) { // 分组背包先遍历容量
				for (int k = 1; k <= p[i]; k++) { // 遍历物品
					if (j >= a[i][k]) dp[j] = Math.max(dp[j], dp[j - a[i][k]] + b[i][k]);
				}
			}
		}
		System.out.println(dp[m]);
	}
}

分组背包模板题,和01背包的主要区别在于每件物品最多选1件,先遍历背包容量,再遍历物品,记得判断容量是否足够。

你可能感兴趣的:(java,算法,开发语言)