AcWing 487. 金明的预算方案 (有依赖关系的背包问题)
题意
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。
更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。
今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
如果要买归类为附件的物品,必须先买该附件所属的主件。
每个主件可以有0个、1个或2个附件。
附件不再有从属于自己的附件。
金明想买的东西很多,肯定会超过妈妈限定的N元。
于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。
他还从因特网上查到了每件物品的价格(都是10元的整数倍)。
他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,…,jkj_1,j_2,…,j_kj1,j2,…,jk,则所求的总和为:
v[j1]∗w[j1]+v[j2]∗w[j2]+…+v[jk]∗w[jk]v[j_1]∗w[j_1]+v[j_2]∗w[j_2]+…+v[j_k]∗w[j_k]v[j1]∗w[j1]+v[j2]∗w[j2]+…+v[jk]∗w[jk](其中*为乘号)
请你帮助金明设计一个满足要求的购物单。
思路
分组背包
先把所有主件存起来 然后把每个主件对应的副件存在一个 vector 中
对每个物品遍历 如果它是主件的话 就枚举一下取哪些它的副件 这里可以用二进制枚举
最后求出最大值即可
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 998244353
#define endl '\n'
#define int long long
using namespace std;
inline int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }
inline int lowbit(int x) { return x & -x; }typedef long long LL;
typedef pair<int, int>PII;
const int N = 70;int n, m;
PII master[N]; //主件
vector<PII>servent[N]; //主件下面的附件
int f[32050];void solve() {cin >> m >> n;for (int i = 1; i <= n; ++i) {int v, w, q; cin >> v >> w >> q;if (q == 0) {master[i] = { v,v * w };}else servent[q].push_back({ v,v*w });}for (int i = 1; i <= n; ++i) {if (master[i].first) { //如果是一个主件for (int j = m; j >= 0; --j) {for (int k = 0; k < 1 << servent[i].size(); ++k) {int v = master[i].first;int w = master[i].second;for (int t = 0; t < servent[i].size(); ++t) {if ((k >> t) & 1) {v += servent[i][t].first;w += servent[i][t].second;}}if (j >= v)f[j] = max(f[j], f[j - v] + w);}}}}cout << f[m] << endl;
}signed main() {//int t; cin >> t;//while(t--)solve();return 0;
}
AcWing 487. 金明的预算方案 (有依赖关系的背包问题)相关推荐
- AcWing 487. 金明的预算方案
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间. 更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行&q ...
- 【ACWing】487. 金明的预算方案
题目地址: https://www.acwing.com/problem/content/489/ 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是, ...
- 487 金明的预算方案(分组背包问题扩展)
1. 问题描述: 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超 ...
- 洛谷——1064金明的预算方案————有依赖的背包
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱 ...
- 【每日DP】day7P1064 金明的预算方案 (分组背包,我又悟了)难度⭐⭐★
P1064 金明的预算方案 背包其实就是把一个大问题拆分成若干个子问题,把一个要拿东西的动作按照题目要求分成若干个动作,分别枚举(DP其实就是非常的暴力),比较取最大值. 比如这道题,背包的物品之间是 ...
- P1064 金明的预算方案
P1064 金明的预算方案 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置 ...
- [LuoguP1064][Noip2006]金明的预算方案
金明的预算方案(Link) 题目描述 现在有\(M\)个物品,每一个物品有一个钱数和重要度,并且有一个\(Q\),如果\(Q = 0\),那么该物件可以单独购买,当\(Q != 0\)时,表示若要购买 ...
- P1064 [NOIP2006 提高组] 金明的预算方案
P1064 [NOIP2006 提高组] 金明的预算方案 题意: 每个物品有价格和价值,物品之间存在依赖关系(单向的),现在又n元钱,买哪些物品,即满足依赖关系又使得每件物品的价格与价值的乘积的总和最 ...
- 不止代码:洛谷P1064 金明的预算方案+P2014选课(依赖背包)
文章目录 题目描述 总结 解析 解法1 解法2 代码 解法3 代码 题目描述 金明的预算方案 选课 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是, ...
最新文章
- 【最精简写法】获取一维数组和对象数组最值:最大值、最小值,返回对象
- 中端存储趋势:x86、SSD缓存和虚拟化
- python写程序求1-3+5-7+...-99+101的值-python基本练习
- android button 行间距,android – 如何减少TextView行间距
- Robust Point Cloud Registration Framework Based on Deep Graph Matching (RGM) 简略分析
- 宁夏大学新华学院08计算机马宁,公 示
- Java学习笔记之设计模式(1)设计模式简介
- 技术员 Ghost Win 10(x86/x64)装机版/纯净版 201808
- 升职加薪必看!java简历包装工作经验
- 创建oracle系统dsn,timesten创建dsn
- 怎么用dos命令打开计算机,如何使用DOS命令打开C盘下的文件夹dos如何打开文件夹...
- Altium-Designer6.9安装报错Application Error
- win10OneNote登录微软 账号登陆出现错误码0x80190001
- 客户分级管理的意义和方法?如何高效的对客户进行分级?
- utools配置内网穿透
- 【iOS】—— 高德地图SDK基础使用
- word文档的只有横线的表格怎样做
- GG 数据初始化装载 说明 与 示例
- DL之Transformer:Transformer的简介(优缺点/架构详解,基于Transformer的系列架构对比分析)、使用方法(NLP领域/CV领域)、案例应用之详细攻略
- 计算机毕业设计文献查阅指引,毕业论文查阅文献记录_毕业论文指导记录文库_毕业论文指导记录12篇...
热门文章
- OpenJ_Bailian 2748
- 苹果手机语音备忘录在哪_苹果手机备忘录被家里宝宝误删了如何恢复呢?
- Pycharm报错:FutureWarning: `distplot` is a deprecated function and will be removed in a future version
- TCP,UDP,IP,数据链路层头部详解
- 普通最小二乘法的两种推导方法
- 自控原理入门详解**********
- 汉信码今发布:国家自主研发的二维码技术
- 第三节: 水泥混凝土路面构造特点
- mt管理器图片在哪个文件夹_微信apk用mt管理器 替换主界面背景图片是那个文件? 其他文件怎么替换 不要视频...
- AriaNg 无法连接 aria