洛谷P1757 通天之分组背包

该博客介绍了一种使用动态规划解决分组背包问题的方法。通过读取物品的重量、价值和所属小组,利用二维数组f来存储状态,更新最大价值。代码中实现了从大到小遍历小组,对每个小组的物品进行处理,动态更新背包容量的最大价值。最终输出背包能容纳的最大价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击进入
思路

分组背包,套板子

代码
#include<iostream>
#include<string>
#include<map>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131 
#define INF 0x3f3f3f3f
#define P pair<int,int>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double eps=1e-5;
const double pai=acos(-1.0);
const int N=1e3+10;
const int maxn=110;
const int mod=1e9+7;
//const int d[4][2]={0,1,1,0,-1,0,0,-1};
int n,m,k,t,w[N],v[N],c[N],g[N][N];
ll f[N];
int main()
{
//	ios::sync_with_stdio(false);
    //memset(f,1e9,sizeof(f));
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
    	scanf("%d%d%d",&w[i],&v[i],&k);//k表示第i个物品的小组编号
    	t=max(t,k);//求小组组数
    	c[k]++;//小组k的物品+1
    	g[k][c[k]]=i; //g[i][j]表示存储小组i中的第j个物品的编号
	}
	for(int i=1;i<=t;i++)
	{//小组
		for(int j=m;j>=0;j--)
		{ //容量
			for(int z=1;z<=c[i];z++)
			{//小组中的物品
				if(j>=w[g[i][z]])
				{//小组i中物品z的容量
					f[j]=max(f[j],f[j-w[g[i][z]]]+v[g[i][z]]);
				}
			}
		}
	}
	printf("%lld\n",f[m]);
	return 0;
}
<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、付费专栏及课程。

余额充值