通天之分组背包 Java

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件,先遍历背包容量,再遍历物品,记得判断容量是否足够。

<think>好的,用户现在在找洛谷平台上关于分组背包算法的题单或者练习题集合。根据之前的对话,用户可能已经了解过一些贪心算法和动态规划的内容,比如引用[1]里提到的Java题解和引用[2]里的杨校老师课堂的背包DP练习题。现在用户明确提到了分组背包,我需要先确认分组背包的基本概念,然后根据现有的引用信息,特别是引用[2]中的题号列表,来提供相关的练习题。 首先,分组背包是动态规划中的一种变体,特点是物品被分成若干组,每组内的物品互斥,只能选一个或者不选。这点需要明确,用户可能需要先理解这个算法,再做题巩固。 引用[2]中提到的分组背包题号包括P1757、P1064、P2066、P1455,这些应该是洛谷的题目编号。我需要检查这些题号是否正确对应分组背包的问题,确保没有错误。比如P1757是“通天分组背包”,这显然是分组背包的典型题目。P1064是金明的预算方案,可能需要将主件和附件视为一组,每组有多个选择。P2066是“机器分配”,可能涉及分组选择。P1455是搭配购买,可能用并查集预处理后再进行分组背包。这些题目都是分组背包的经典题,适合用户练习。 接下来,用户可能需要题单,而不仅仅是单个题目。洛谷的题单功能中是否有专门的背包DP或分组背包的合集呢?根据引用[2]中的信息,用户提到的杨校老师课堂的题单里有分组背包的部分,但用户现在可能需要直接在洛谷上找到这些题单。我需要确认洛谷是否有官方或用户创建的题单包含这些题目。 另外,用户可能希望得到每个题目的简要说明,比如考察点和难度,这样他们可以有针对性地练习。比如P1757是模板题,适合入门;P1064需要结合依赖关系进行处理,可能稍难;P1455结合并查集,是分组背包的变种应用,适合提高。这样的分类可以帮助用户逐步提升。 同时,用户可能需要一些学习建议,比如先掌握0-1背包和完全背包,再学习分组背包,以及如何高效地处理分组问题。此外,注意事项如循环顺序(先枚举组,再体积,最后组内物品)也很重要,避免常见的错误。 最后,确保回答中提到的题号正确,并且引导用户参考洛谷的对应题目页面获取详细信息和题解。如果有其他相关题单,比如“算法1-6:动态规划的背包问题”等,也值得推荐,帮助用户系统学习。</think>根据洛谷平台的题库结构和相关算法分类,以下是针对分组背包算法的推荐题单及核心练习题整理: --- ### 一、分组背包算法核心练习题 1. **P1757 通天分组背包** - **标签**:模板题/基础训练 - **考察点**:标准分组背包实现,每组物品只能选其一 - **代码框架**: ```python for 所有组: for 体积从大到小: for 组内物品: dp[v] = max(dp[v], dp[v - w[i]] + v[i]) ``` 2. **P1064 金明的预算方案** - **标签**:依赖关系处理 - **考察点**:主件+附件构成分组,每组包含主件单独选、主件+附件1、主件+附件2等组合方式[^2] 3. **P2066 机器分配** - **标签**:分组模型转换 - **考察点**:将公司看作组,机器数量为组内选择,需输出具体方案 4. **P1455 搭配购买** - **标签**:并查集预处理 - **考察点**:先用并查集合并关联商品形成分组,再转化为分组背包问题 --- ### 二、推荐题单路径 1. **洛谷官方题单** - **算法1-6:动态规划的背包问题** 包含0-1背包、完全背包、多重背包分组背包等分类练习题,覆盖所有背包变种[^2] 2. **用户创建题单** - **动态规划专题训练**(搜索关键词:分组背包) 通常包含P1757、P1064等经典题目及变种题型 --- ### 三、学习建议 1. **先修知识** - 熟练掌握0-1背包(P1048)、完全背包(P1616)后再学习分组背包 2. **刷题顺序** - 模板题 → 依赖关系题 → 预处理综合题 3. **注意事项** - 循环顺序必须为 **组→体积→组内物品** - 若要求每组必选一个物品,需初始化`dp`数组为`-inf` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值