hdu 3449(依赖背包) Consumer

HDU 3449 Consumer 详细题解(依赖背包) Consumer Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/65536 K (Java/Others) Total Submission(s): 2125    Accepted Submission(s): 1143 Problem Description FJ is going to do 阅读详情

题意:

给n个箱子,每个箱子有个费用pi,每个箱子里面有m个物品,每个物品有两个属性,一个费用wi和一个价值vi。买物品的时候要把所属的箱子一起买了,问给一个金额W最多能获得多少价值?

思路

依赖背包。《背包九讲》的第七讲讲了这个。
设dp[i][j]为前i个箱子使用金额j获得的最大价值。
考虑每个箱子内部就是一个01背包,那么在枚举每一个箱子的时候,使用上一轮能满足本轮箱子费用的状态做一个01背包,然后本轮结束后更新dp数组。
最后的ans就是dp[n][W]
需要深刻理解一下这个依赖关系。

复杂度:

O(n*m*W)

参考code:

/*
 #pragma warning (disable: 4786)
 #pragma comment (linker, "/STACK:0x800000")
 */
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <iterator>
#include <utility>
using namespace std;

template< class T > T _abs(T n) { return (n < 0 ? -n : n); }
template< class T > T _max(T a, T b) { return (!(a < b) ? a : b); }
template< class T > T _min(T a, T b) { return (a < b ? a : b); }
template< class T > T sq(T x) { return x * x; }
template< class T > T gcd(T a, T b) { return (b != 0 ? gcd<T>(b, a%b) : a); }
template< class T > T lcm(T a, T b) { return (a / gcd<T>(a, b) * b); }
template< class T > bool inside(T a, T b, T c) { return a<=b && b<=c; }


#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define F(i, n) for(int (i)=0;(i)<(n);++(i))
#define rep(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define urep(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define repok(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))            
#define MEM0(addr) memset((addr), 0, sizeof((addr)))
#define MP(x, y) make_pair(x, y)
#define REV(s, e) reverse(s, e)
#define SET(p) memset(pair, -1, sizeof(p))
#define CLR(p) memset(p, 0, sizeof(p))
#define MEM(p, v) memset(p, v, sizeof(p))
#define CPY(d, s) memcpy(d, s, sizeof(s))
#define READ(f) freopen(f, "r", stdin)
#define WRITE(f) freopen(f, "w", stdout)
#define SZ(c) (int)c.size()
#define PB(x) push_back(x)
#define ff first
#define ss second
#define ll long long
#define ld long double
#define pii pair< int, int >
#define psi pair< string, int >
#define ls u << 1
#define rs u << 1 | 1
#define lson l, mid, u << 1
#define rson mid, r, u << 1 | 1

const int maxn = 1e6+5;
const ll INF = 0x3f3f3f3f3f3fLL;

int dp[60][100010];
int tmp[100010];
int main(){
    //READ("in.txt");
    int n,W;
    while(scanf("%d%d",&n,&W)!=EOF){
        MEM0(dp);
        int p,w,m,v;
        rep(i,1,n){
            scanf("%d%d",&p,&m);
            MEM(tmp,-1);
            rep(j,p,W) tmp[j] = dp[i-1][j-p];
            rep(j,1,m){
                scanf("%d%d",&w,&v);
                urep(k,W,w)
                    if(tmp[k-w] != -1)
                        tmp[k] = max(tmp[k],tmp[k-w]+v);
            }
            rep(j,0,W)
                dp[i][j] = max(dp[i-1][j],tmp[j]);
        }
        printf("%d\n", dp[n][W]);
    }
    return 0;
}
hdu 3449 Consumer 依赖背包 依赖背包 事实上,这是一种树形DP,其特点是每个父节点都需要对它的各个儿子的属性进行一次DP以求得自己的相关属性。 fj打算去买一些东西,在那之前,他需要一些盒子去装他打算要买的不同的物品。每一个盒子有特定要装的东西(就是说如果他要买这些东西里的一个,他不得不先买一个盒子)。每一种物品都有自己的价值,现在FJ只有W元去购物,他打算用这些钱买价值最高的东西。 Consumer 阅读详情

相关推荐

有依赖的背包问题:金明的预算

属于动态规划,背包问题,有依赖背包问题,金明的预算相应方案!即代码部分和每一句代码详细分析!

背包九讲 之 依赖背包

依赖背包 问题重述 有 N 个物品和一个容量是 V 的背包。 物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。 如果选择物品5,则必须选择物品1和2。这是因为2是5的父节点,1是2的父节点。 每件物品的编号是 i,体积是 vi,价值是 wi,依赖的父节点编号是 pi。物品的下标范围是 1…N。 求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价...

actioncms的博客 2239

海康工业相机BayerRG8转BGR8实战:手把手教你用OpenCV实现高效图像转换

本文详细解析了海康工业相机BayerRG8格式到BGR8格式的高效转换实战。针对工业视觉项目中高帧率、大分辨率场景下的性能瓶颈,文章对比了海康SDK原生方案与OpenCV多种转换方法的优劣,并提供了从基础实现到高级优化(如多线程流水线、内存管理、SIMD指令集应用)的完整代码示例与性能调优策略,帮助开发者构建稳定、高效的图像处理系统。

weixin_29237635的博客 524

【算法 | 背包专题】有依赖的背包问题,多个物品变成一个复合物品(互斥)

在有依赖的背包问题中,多个物品可以被视为一个复合物品,这些物品之间可能存在互斥关系(即,选择了一个就不能选择另一个)。同时,每个复合物品可能有多种选择方式。

翼同学 2200

MaxKey+JeecgBoot单点登录实战:手把手教你从零配置到账户同步

本文提供MaxKey与JeecgBoot单点登录(SSO)的实战整合指南。详细讲解从MaxKey应用注册、JeecgBoot前后端改造,到最终实现账户同步的完整步骤,重点解决Shiro配置、令牌交换等关键问题,帮助企业构建统一、可扩展的身份管理体系。

weixin_29258297的博客 541

K8S证书过期解决办法之替换证书

k8s证书过期解决方案之替换证书

q_hsolucky的博客 1万+

依赖背包

依赖背包 问题来源:P1064 金明的预算方案(NOIP2006) 背包中的物品存在依赖关系,也就是说,如果选i物品,就必须选择j物品,j为主件,i为附件 分析 按照背包的一般思路,我们可以考虑对所有的主件进行dp选择,然后在选择每一个主件的时候再枚举附件,当然这个题只是每个主件最多只有2个附件,所以这就只有5个策略,但是如果我们推广到n呢,策略则有2n+1之多,为指数级。 我们在上边的基础上,我...

weixin_43519121的博客 1396

风力发电机并网模型建立及仿真验证

传统能源日益匮乏,环境污染日趋严重,全球向安全、可靠和环保的可持续能源体系转型迫在眉睫,风电迎来了重要的发展契机。近年来,全球风电迅猛发展,我国已成为世界风电新增装机容量第一的国家。然而,随着风电规模的不断增大,风电场接入对系统影响不容忽视。随着变速恒频风力发电系统优越的性能突出和大容量电力电子技术的成熟,风速随机性引起的功率波动及故障情况下的动态响应,对电能质量,系统电压、频率的稳定性产生的影响需要深入研究。因而,本文结合实际项目,针对变速恒频风力发电系统建模,端口动态特性及对电网电能质量、运行稳定性的影

毕业设计区博客 1639

有依赖的背包问题

从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数v p q,其中v表示该物品的价格,p表示该物品的重要度(1~5),q表示该物品是主件还是附件。有依赖的背包问题一般会有一定的限制条件,例如选择某一件的前提是选择了另一件物品, 选第 i 件物品,就必须选择第 j 件物品,保证不会循环引用。设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,…输入文件的第1行,为两个正整数,用一个空格隔开:N m,其中N表示总钱数,m为希望购买物品的个数。

weixin_62224014的博客 1938

FastDDS之共享内存

transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。

u010378559的博客 3085

用Verilog手把手教你搭建一个5级流水线的MIPS CPU(附完整代码与仿真)

本文详细介绍了如何使用Verilog从零构建一个5级流水线的MIPS处理器,包括开发环境配置、核心模块实现、流水线冲突处理等关键技术。通过完整的代码示例和仿真方法,帮助读者掌握CPU设计的基本原理和实践技巧,特别适合想要入门处理器设计的工程师和学习者。

weixin_30613727的博客 462

01背包理论和有依赖的背包

在⼀维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]

2301_80610560的博客 1944

YOLOv9改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 1364

HDU - 3449 Consumer(有依赖的背包问题)

题目大意:有N个箱子,每个箱子需要花费Ai的代价 箱子里面有K个物品,K个物品你可以选择买任意个,但每个物品只能买一个,每个物品有相应的花费和价值 你又M的钱,最多能得到多少价值解题思路:这题我用滚动数组 先处理出买了当前箱子的情况,然后在买了当前箱子的情况下,在进行01背包,具体可以看代码#include <cstdio> #include <cstring> #include <algor

静静地码 829

从原理到落地:Java+TensorRT打造YOLO模型GPU极致推理方案

Java+TensorRT的YOLO模型GPU加速方案,核心是通过JNI桥接实现Java与TensorRT的高效交互,结合TensorRT的底层优化能力,最大化GPU算力。该方案既保留了Java后端的工程化优势(如易维护、生态完善),又解决了AI模型推理的性能瓶颈,可落地于实时视频分析、智能监控、工业质检等场景。基于TensorRT Dynamic Shape实现多尺寸输入的自适应优化;结合Java的协程(Virtual Thread)提升异步推理的并发效率;

2601_94871597的博客 766

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

hdu 3449 Consumer(依赖背包)

hdu 3449分析这道题也算是涨涨见识了吧,但实际上是可以自己推出来的,还是有点迷+没有方法。 题目就是说,告诉你有几个组,你有多少钱,对于每个组来说里面有物品,物品有价值和代价,约束是,想要买组里的东西,首先要花钱买这个组的“箱子”。求最大价值。 大方向来说,对于一组,无非就是买或不买,不买就继承上一组的,买就继承上一组减掉这组盒子价钱的状态,然后对盒子进行01背包。两件事情要分开来做。我们

天道酬勤 498

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

hdu 3449 Consumer 依赖背包~~

Problem Description FJ is going to do some shopping, and before that, he needs some boxes to carry the different kinds of stuff he is going to buy. Each box is assigned to carry some specific kinds of stuff (that is to say, if he is going to buy one of the

Lionel 1003

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

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HDU 3449 Consumer 【有依赖背包】【dp】

Consumer Time Limit: 4000/2000 MS(Java/Others)    Memory Limit: 32768/65536 K (Java/Others) Total Submission(s): 1671    Accepted Submission(s): 873 Problem Description FJ is going to dosome

我为刀俎_题为鱼肉 407

HDU 3449:Consumer(有依赖关系的背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3449 题目翻译: 有N个盒子,每个盒子价值是p,其内部有m个物品,每个物品的花费为c,价值为p. 如果想要购买盒子内的物品,就必须先花钱买盒子。 所以对于某个盒子来所,我们分为买与不买,首先我们备份其没买时候的值, 然后考虑买这个盒子,如果买盒子的话,则先减去买盒子的钱。然后

温姑娘的博客 573

HDU 3449 Consumer 有依赖背包 分组背包 (算法有问题)

题意: 有50个盒子, 每个盒子里有10个物品, 物品有价值和花费, 盒子只有花费, 只有买了盒子才能买其中的物品, 问总共花P块钱(P<100000)最多能得到多少价值. 思路: ①一开始不记得有依赖背包, 想起之前写的挖矿的题, 以为可以直接写分组背包, 以下是错误的思路: 对于每个盒子, dfs遍历这个盒子内所有的取法, 然后每个盒子是一个分组, 跑分组背包. 复杂度: dfs...

swqeaaa的博客 220

HDU 3449 Consumer (依赖背包)

链接: Consumer 题意 : 有 n个背包,每个背包里有若干件物品,物品有对应的价格和价值,要想买物品,必须先把背包买下来,问最多能得到多少价值的物品。 思路: 先把某一个背包买下来,再对背包内的物品作 01 背包,再和上一次不买这个背包时的价值比较,取较大值(用了滚动数组)。 代码 #include<iostream> #include<cstdio> #include<map> #include<math.h> #include<queue&

hddddh的博客 179

HDU 3449 Consumer 有依赖的背包

Consumer 题目链接:HDU 3449 Consumer #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define INF 0x3f3f3f3f #define N 100001 using namespace std; int main() { int n, m; vector<int> box[50];

热爱编程,热爱技术 204

HDU 3449 Consumer(依赖背包)

依赖背包入门提。 购买某个物品时,必须先买其对应的箱子。求最大价值。 其实这是一种树形DP,因为对每个父节点都要更新其儿子值。 对第i组数据,先存储其买当前盒子的值,然后对这个组做01背包,这个当然是用这一组盒子的最优数据。做完01背包之后,再与i-1组比较,前面做的操作都是用这组盒子产生的最优值,那么与dp[i-1],dp[i-1]显然是没有用第i组盒子的最优值,所以其实就是用box[i]

ACMiao的博客 462

HDU 3449 Consumer有依赖的01背包

有nnn个购物车,每个车可以购买特定的商品,买商品之前必须花费代价购买对应的购物车,求www可以购买的最大的商品价值。 在有依赖的背包问题中,购物车称为"主件",商品为"附件"; #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algo...

侯山窝矿工 199

HDU 3449 Consumer(有依赖背包)

Consumer Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Total Submission(s): 2385 Accepted Submission(s): 1269Problem Description FJ is going to do some shoppin

南风古 317
上一篇: hdu 3448(搜索+剪枝)Bag Problem
下一篇: hdu 3466(排序+背包)Proud Merchants
Notdeep__acm
博客等级 码龄12年 20粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值