当前位置:网站首页>有依赖的背包,狭义(二进制枚举),广义(树形dp)
有依赖的背包,狭义(二进制枚举),广义(树形dp)
2022-07-17 05:13:00 【lovesickman】
[NOIP2006 提高组] 金明的预算方案
题目描述
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 n n n 元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
| 主件 | 附件 |
|---|---|
| 电脑 | 打印机,扫描仪 |
| 书柜 | 图书 |
| 书桌 | 台灯,文具 |
| 工作椅 | 无 |
如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 0 0 个、 1 1 1 个或 2 2 2 个附件。每个附件对应一个主件,附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 n n n 元。于是,他把每件物品规定了一个重要度,分为 5 5 5 等:用整数 1 ∼ 5 1 \sim 5 1∼5 表示,第 5 5 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 10 10 元的整数倍)。他希望在不超过 n n n 元的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第 j j j 件物品的价格为 v j v_j vj,重要度为 w j w_j wj,共选中了 k k k 件物品,编号依次为 j 1 , j 2 , … , j k j_1,j_2,\dots,j_k j1,j2,…,jk,则所求的总和为:
v j 1 × w j 1 + v j 2 × w j 2 + ⋯ + v j k × w j k v_{j_1} \times w_{j_1}+v_{j_2} \times w_{j_2}+ \dots +v_{j_k} \times w_{j_k} vj1×wj1+vj2×wj2+⋯+vjk×wjk。
请你帮助金明设计一个满足要求的购物单。
输入格式
第一行有两个整数,分别表示总钱数 n n n 和希望购买的物品个数 m m m。
第 2 2 2 到第 ( m + 1 ) (m + 1) (m+1) 行,每行三个整数,第 ( i + 1 ) (i + 1) (i+1) 行的整数 v i v_i vi, p i p_i pi, q i q_i qi 分别表示第 i i i 件物品的价格、重要度以及它对应的的主件。如果 q i = 0 q_i=0 qi=0,表示该物品本身是主件。
输出格式
输出一行一个整数表示答案。
样例 #1
样例输入 #1
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
样例输出 #1
2200
提示
数据规模与约定
对于全部的测试点,保证 1 ≤ n ≤ 3.2 × 1 0 4 1 \leq n \leq 3.2 \times 10^4 1≤n≤3.2×104, 1 ≤ m ≤ 60 1 \leq m \leq 60 1≤m≤60, 0 ≤ v i ≤ 1 0 4 0 \leq v_i \leq 10^4 0≤vi≤104, 1 ≤ p i ≤ 5 1 \leq p_i \leq 5 1≤pi≤5, 0 ≤ q i ≤ m 0 \leq q_i \leq m 0≤qi≤m,答案不超过 2 × 1 0 5 2 \times 10^5 2×105。
有依赖的背包简单版,或者直接叫做分组背包。
你能发现下标的代码哪里错了吗
时间复杂度 O ( n m ) O(nm) O(nm)
int n,m;
struct good{
int v,w;
};
vector<good>g[70];
int f[40010];
void solve(){
cin>>m>>n;
fo(i,1,n){
int v,w,s;cin>>v>>w>>s;
if(!s){
g[i].pb({
v,w});
}
else{
g[s].pb({
v,w});
}
}
for(int j=m;j>=0;j--){
for(int i=1;i<=n;i++){
if(!g[i].size())continue;
auto p = *g[i].begin();
// debug(p.v);
for(int k=0;k<((g[i].size()-1)<<1);k++){
// debug(k);
if(!k){
if(j-p.v>=0)
f[j] = max(f[j],f[j-p.v]+p.w*p.v);
}
else if(k==1 || k==2){
auto x = g[i][k];
if(j-x.v-p.v>=0)
f[j] = max(f[j],f[j-x.v-p.v]+x.w*x.v+p.w*p.v);
}
else{
auto x = g[i][1];
auto y = g[i][2];
if(j-x.v-y.v-p.v>=0)
f[j] = max(f[j],f[j-x.v-y.v-p.v]+x.w*x.v+y.w*y.v+p.w*p.v);
}
}
}
}
cout<<f[m]<<endl;
}
int main(){
solve();
return 0;
}
解密:
if(!k){
if(j-p.v>=0)
f[j] = max(f[j],f[j-p.v]+p.w*p.v);
}
这句需要放到外边,不然循环不到qwq
有依赖的背包问题,树上背包
抽象出模型,类比树形dp, f [ u ] [ j ] f[u][j] f[u][j] 表示以 u u u 节点为根节点,花费 j j j 所能得到的最大价值。
考虑每个儿子选还是不选,考虑到儿子的儿子的体积一定是 1 1 1 的倍数,所以对 u u u 节点的所有儿子做分组背包。
先 dfs 进去,回溯的时候做分组背包。
注意初始化
for(int i=v[u];i<=m;i++){
f[u][i] = w[u];
}
int n,m;
int h[110],e[210],ne[210],idx;
int v[110],w[110];
int f[110][110];// f[u][j] 表示 u 为根的子树花费 j 取得的最大值
int root;
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void dfs(int u,int fa){
for(int i=v[u];i<=m;i++){
f[u][i] = w[u];
}
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa)continue;
dfs(j,u);
for(int k=m;k>=v[u];k--){
for(int l=0;l<=k-v[u];l++){
f[u][k] = max(f[u][k],f[u][k-l]+f[j][l]);
}
}
}
}
void solve(){
memset(h,-1,sizeof(h));
cin>>n>>m;
fo(i,1,n){
int x;
cin>>v[i]>>w[i]>>x;
if(x!=-1){
add(x,i);
add(i,x);
}
else root = i;
}
dfs(root,-1);
cout<<f[root][m]<<endl;
}
int main(){
solve();
return 0;
}
边栏推荐
- 设置索引库结构,给用户添加可自动补全的suggestion,并将一些字段变成集合放到suggestion里面去
- Complete scheme diagram of lth7 five pin chip fs4054 charging circuit principle
- 比例阀放大板1A、2A、3A、5A比例阀驱动模块0-10V转0-24V
- Fs68001 wireless charging SOC chip has simple periphery and schematic diagram of 5W wireless charging scheme
- 2019CS品牌SDNAND和eMMC选择对比重要分析
- 软考初、中、高级考试全体验
- Simple chrome script automatically skips the charging acknowledgment page after the video playback of station B ends
- 配置VsCode中‘log’快捷键去掉console.log(‘‘);中的分号;
- Wireless charging mouse pad RGB LED lighting wireless charging mouse pad
- 升压DC/DC转换器
猜你喜欢
![[详细教程安装][配置] VsCode中关于Eslint的辅助插件](/img/d4/31272772b96d3e2f702da74478fd95.png)
[详细教程安装][配置] VsCode中关于Eslint的辅助插件

Tips for using tp4054 charging IC -- used in conjunction with Zhongke Lanxun ab5365b

ES聚合分析报错:“reason“ : “Text fields are not optimised for operations

Solve cannot read properties of null (reading 'pickalgorithm')

CS品牌SD NAND在空气质量检测行业中的应用案例

Material and application circuit diagram of 0-10V, 4-20mA current voltage to PWM isolation converter

单片机的好搭档-CS创世SD NAND FLASH

golang 多项目工作区搭建

It4058a single lithium ion battery charging management

MySQL Workbench基本使用【创建一个数据库】
随机推荐
数字信号隔离模块 ADUM1401ARWZ 亚德诺 库存现货
3.7V锂电池升压到5V1A,FS2114升压转换芯片设计布局
minio基础知识介绍
EasyDarawin流媒体服务器介绍
sd nand与nandflash的区别?
Lithium battery charging management chip
minio安装部署及简单使用
Thermal resistance PT100 cu50 isolation converter to 4-20mA analog output temperature transmitter 0-10V
【CS创世】 SD NAND和Raw NAND优劣势对比分析
Chrome浏览器设置 【显示右上角 翻译语言图标】
DSL实现Bucket聚合
Dac7512n analog mixed signal IC converter
无线充发光鼠标垫RGB LED照明无线充电鼠标垫
It4058a single lithium ion battery charging management
QTSS回调例程
4路编码器脉冲计数器,8路DO,Modbus TCP模块
Rs-485/232 to 4-20ma/0-10v isolated d/a converter
2021-11-26 pyautogui 配合雷电模拟器实现手机APP签到答题自动化
General review of software process and management
国际标准信号0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等的转换隔离和传输