P1757 分组背包

【题解-洛谷】P1757 通天之分组背包 直达通天路·小 A 历险记第二篇。 阅读详情

题目描述:

题目传送门


解题思路:

依题意得,同组内的元素会互相冲突,也就是说同一组只能选一个,也就是说在组内做01背包。

我们先来看看伪代码:

for 所有的组k
    for v=V..0
        for 所有的i属于组k
      f[v]=max{f[v],f[v-w[i]]+c[i]}

第一重循环比较好理解,就是一组一组下去的做01背包。但是for v=V..0必须放在for 所有的i属于组k的外面,这是为了保证在当前容量中,每一个同组的物品只会选到一个。
如:
当枚举到 f v f_v fv​ 时, f v = m a x ( f v   ,   f v − w i + v i ) f_v=max(f_v\ ,\ f_{v-w_i}+v_i) fv​=max(fv​ , fv−wi​​+vi​),显然, f v − w i f_{v-w_i} fv−wi​​ 是选到上一组的时候的最优解,不包括选取当前组内物品的情况,不会影响每一组只选一个的特性。


CODE:

#include <iostream>
#include <cstring>
using namespace std;
int V,n,t;
struct Gar
{
	int v[5000],w[5000],len;
} a[200];
long long f[100100]={0};
int main()
{
	cin>>V>>n;
	for(int i=1;i<=n;i++)
	  {
	  	int b,c,d;
	  	cin>>b>>c>>d;
	  	t=max(t,d);  //最大的组数就是组的总数
	  	a[d].w[a[d].len+1]=b;  //将物品分组方便选择
	  	a[d].v[a[d].len+1]=c;
	  	a[d].len++;
	  }
	for(int i=1;i<=t;i++)
	  {
	  	for(int j=V;j>=0;j--)
	  	  {
	  	    for(int k=1;k<=a[i].len;k++)
			  {
			  	if(j<a[i].w[k]) continue;  //如果当前容量不能放下当前物品,则跳过
			  	f[j]=max(f[j],f[j-a[i].w[k]]+a[i].v[k]);
			  }	
		  }
	  }
	cout<<f[V];
	return 0;
} 

再给一道练习巩固:
TENSHI在经历了无数次学科竞赛的失败以后,得到了一个真理:做一题就要对一题!但是要完全正确地做对一题是要花很多时间(包括调试时间),而竞赛的时间有限。所以开始做题之前最好先认真审题,估计一下每一题如果要完全正确地做出来所需要的时间,然后选择一些有把握的题目先做。 当然,如果做完了预先选择的题目之后还有时间,但是这些时间又不足以完全解决一道题目,应该把其他的题目用贪心之类的算法随便做做,争取“骗”一点分数。
任 务根据每一题解题时间的估计值,确定一种做题方案(即哪些题目认真做,哪些题目“骗”分,哪些不做),使能在限定的时间内获得最高的得分,

Input

第一行有两个正整数N和T,表示题目的总数以及竞赛的时限(单位秒)。以下的N行,每行4个正整数W1i 、T1i 、W2i 、T2i ,分别表示第i题:完全正确做出来的得分,完全正确做出来所花费的时间(单位秒),“骗”来的分数,“骗”分所花费的时间(单位秒)。
其中,3 ≤ N ≤ 30,2 ≤ T ≤ 1080000,1 ≤ W1i 、W2i ≤ 30000,1 ≤ T1i 、T2i ≤ T。

Output

所能得到的最高分值

Sample Input

样例1
4 10800
18 3600 3 1800
22 4000 12 3000
28 6000 0 3000
32 8000 24 6000

样例2
3 7200
50 5400 10 900
50 7200 10 900
50 5400 10 900
Sample Output

样例1
50

样例2
70
Source

elba

洛谷P1757 分组背包题解 题目传送门 题目描述 自 01 背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。 输入格式 两个数 m,n,表示一共有 n 件物品,总重量为 m。 接下来 n 行,每行 3 个数 a,b,c ,a表示物品的重量,b利用价值,c所属组数。 输出格式 一个数,最大的利用价值。 输入输出样例 输入 45 3 10 10 1 10 5 1 50 400 2 输出 10 说明/提示 1≤m 阅读详情

相关推荐

洛谷 P1757 通天之分组背包(动规分组背包)

P1757 通天之分组背包 时间限制1.00s 内存限制125.00MB 题目背景 直达通天路·小 A 历险记第二篇 题目描述 自 01 背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。 输入格式 两个数 m,n,表示一共有 n 件物品,总重量为 m。 接下来 n 行,每行 33 个数 a_i,b_i,c_i,表示物品的重量,利用价值,所属组数。 输出格式 一个数,最大的利用价值

weixin_45417428的博客 312

(分组背包)洛谷P1757通天之分组背包

洛谷P1757通天之分组背包 思路: 分组背包模板题。 代码: #include<bits/stdc++.h> const int N=1e6+10; const int mod=1e7+9; const int maxn=0x3f3f3f3f; const int minn=0xc0c0c0c0; const int inf=99999999; using namespace std...

Z7784562的博客 291

深度学习的unfold操作

对于彩色图像这样的三维数据,unfold操作会对每个通道分别进行上述的二维展开操作。例如,一个 RGB 图像,在对其进行unfold操作时,红色通道、绿色通道和蓝色通道的数据都会被独立地按照定义的窗口和步长展开,然后将这些展开后的通道数据按照原来的通道顺序组合在一起,形成新的张量。与我们熟悉的卷积类似,unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动,不同的是,卷是滑动后与核求乘积(所以取名为卷积),而unfold滑动后不求乘积,是将窗口内的数据展开。

xulibo5828的博客 2163

P1757 通天之分组背包

P1757 通天之分组背包

青少年趣味编程 1080

傻白入门芯片设计,芯片键合(Die Bonding)(四)

傻白入门芯片设计,芯片键合(Die Bonding)(四) 引线键合、倒装芯片键合、管脚贴合技术

qq_46675545的博客 3万+

欧姆龙OMRON PLC之HostLink通讯协议(四)-FINS命令进阶应用与调试技巧

本文深入探讨欧姆龙OMRON PLC的HostLink通讯协议中FINS命令的进阶应用与调试技巧。文章聚焦实战排错,详细解析命令帧解剖、响应帧解读与网络抓包三大核心方法,并分享性能优化策略,如合并读写与异步设计。同时介绍了强制操作、多存储区访问等高级命令的应用场景,旨在帮助工程师高效解决现场通讯问题,提升系统稳定性与效率。

nept的博客 748

洛谷P1757 通天之分组背包

分组背包模版

夜深人静写代码 919

Vue项目实战:5分钟搞定高德地图离线部署(附避坑指南)

本文详细介绍了在Vue项目中实现高德地图离线部署的完整方案。针对内网或网络隔离环境,通过获取并改造JSAPI文件、下载组织地图瓦片数据,并集成vue-amap组件,实现地图功能的本地化运行。文中提供了核心代码、避坑指南及性能优化建议,帮助开发者快速构建稳定可靠的离线地图应用。

data3的博客 935

洛谷 P1757 通天之分组背包 分组背包

https://www.luogu.com.cn/problem/P1757 思路:分组背包裸题。 #include<bits/stdc++.h> #define INF 0x3f3f3f3f #define eps 1e-8 #define pr pair<int,int> using namespace std; typedef long long ll; const...

xiji333的博客 290

Opencv计算相机响应函数(Camera Response Function)与Radiance

本文主要用于记录自己在学习CRF过程中遇到的一些问题。 CRF模型 I=f(V(t⋅L))I=f(V( t\cdot L))I=f(V(t⋅L)) 其中III为相机灰度值Intensity,LLL为环境中irradiance,ttt为曝光时间,VVV为相机镜头参数,fff为相机响应函数CRF。 有些论文中认为相机镜头参数是线性的不考虑,但有些考虑了衰减即靠近图像边缘亮度会暗一些,但没有看到二者同时计算的,如果同时计算两个非线性的函数,我觉得可能会有不确定性,在这里还请教一下了解的朋友。 控制

larrydong的博客 5997

驱动钛丝(SMA)的应用(5)汽车腰托气阀常见问题及解决方案

财哥在前段时间发布的《驱动钛丝(SMA)的应用(1)汽车腰托支撑按摩气阀模块》一文,引发了很多企业的拜访和交流。 目前很多厂家已经启动或正在进行相关研发,同时也遇到了诸如:钛丝选型、驱动位移、响应设计、温度控制、力量设计、点动滞后、铆接工艺、量化生产等问题。

weixin_39168671的博客 1239

洛谷 P1757 通天之分组背包 题解

分组背包 动态规划 洛谷题解 C++代码 附详细题解

一只摸鱼的bbc 1203

霜冰优化算法(RIME)详解:从自然现象到智能优化

霜冰优化算法(RIME)是一种新型元启发式优化算法,灵感源于自然界中霜冰的形成过程。该算法通过模拟软霜和硬霜的不同生长特性,实现了高效的全局探索和局部开发平衡。RIME算法包含三个核心机制:软霜搜索策略模拟随机覆盖特性实现全局探索;硬霜穿刺机制模拟定向生长特性进行局部开发;正向贪婪选择机制确保解的持续优化。与遗传算法、粒子群算法相比,RIME具有参数少、收敛快、自适应平衡等优势,特别适合处理高维复杂优化问题。算法已在工程优化、机器学习等领域获得广泛应用,发表一年内即成为高被引论文。

qq_42212808的博客 779

P1757 通天之分组背包题解

文章目录【题目链接】【解题思路】 【题目链接】 洛谷P1757 【解题思路】 和题目名一样,本题就是一道分组背包的模板题,我来讲一下分组背包。 首先,全部的背包都是可以转化成01背包来做的。 例如: 完全背包 10 2 3 4 我们可以将其转化成 10 2 2 2 2 2 3 3 3 4 4 来做01背包。 但是当背包容量很大时,我们会发现这样子的效率太低了。 怎么办呢? 我们可以利用二进制优化。 例如: 100 1 我们拆的时候可以拆成 100 1 2 4 8 16 32 37 这样我们也可以用这

FKJDASOI的博客 266

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

Robot_PLC_HMI_Automation 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

洛谷 P1757:通天之分组背包

令 f[i][j] 表示将前 i 组物品放入容量为 j 的背包中可以获得的最大价值,vol[i][k] 表示第 i 组第 k 个物品的体积,val[i][k] 表示第 i 组第 k 个物品的价值,cnt[i] 表示第 i 组物品的个数,则分组背包问题的状态转移方程为:f[i][j]=max(f[i-1][j], f[i-1][j-vol[i][k]]+val[i][k]), j>=vol[i][k]

hnjzsyjyj的专栏 377

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[分组背包] P1757 通天之分组背包

P1757 通天之分组背包 链接:https://www.luogu.com.cn/problem/P1757. 题目背景 直达通天路·小 A 历险记第二篇 题目描述 自 01背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。 输入格式 两个数 m,n表示一共有 n 件物品,总重量为 m。 接下来 n行,每行 3个数 ai,bi,ci表示物品的重量,利用价值,所属组数。 输出格式 一

Thfooly的博客 420

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

洛谷每日一练5.15--P1757+P1964(分组背包)

文章目录P1757题目思路P1964题目思路 P1757 题目 题目描述 自 01 背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。 输入格式 两个数 m,n,表示一共有 n 件物品,总重量为 m。 接下来 n 行,每行 3 个数 a_i,b_i,c_i ,表示物品的重量,利用价值,所属组数。 输出格式 一个数,最大的利用价值。 输入输出样例 输入 #1 45 3 10 10 1

AugenStern的博客 453

洛谷P1757 通天之分组背包 //分组背包

分组背包裸体 分组背包和普通01背包的区别就是分组背包最外层为枚举的是组数(01背包是物品数),然后在最内层枚举的是枚举各组中物品的序号,这样每个体积下,每种物品只会选择一个价值最大的。idx数组是将最组中每个物品的序号记录下来。 #include&lt;iostream&gt; #include&lt;bits/stdc++.h&gt; using namespace std; int d...

samscream的博客 602

LUOGU P1757 通天之分组背包

蒟蒻的第一篇博客,请(bu)多(yao)指(pen)教(wo)。 最近迷上了背包,感觉这是一个对初学者非常友好的算法,毕竟只需要套模板。直到我遇到了分组背包 LUOGU P1757 通天之分组背包 其实分组背包对本蒟蒻来说也是套模板,但我弱到连套模板都做不出来······ 分组背包与普通01背包的区别在于每件物品有属于自己的组别,且每组的物品互斥。这意味着每组中我们最多只能取一件物品。 做得时候感...

weixin_43613146的博客 347

洛谷 P1757【通天之分组背包】

题目链接 思路: 很简单的分组背包裸题,在做过AreYouBusy(pre blog)之后已经可以一遍过。 每组选一,即AtMostOne问题。一组一组平推,每次用rec数组记录,属于做过一遍就不会忘的方法。 注意转移方程不要写错,dp[ j ] 代表可能已经使用了本组中某物品之后得到的最大值,rec[ j - w[i] ] + v[ i ] 代表是第一次选本组中的物品。 代码: ​//16m...

Masker 400
上一篇: SSL 1203 书的复制
下一篇: SSL 1664 取数字问题
.SAI.
博客等级 码龄5年 835粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值