DTOJ3489 可怜与超市(supermarket)

  • 题目
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例
      • 样例输入1
      • 样例输出1
      • 样例输入2
      • 样例输出2
    • 数据范围与提示
  • 题解

题目

题目描述

九条可怜有 b b b块钱,她准备去超市买东西
超市有 n n n样商品,其中第 i i i个商品的价格是 c i c_i ci​元,并且每种商品只能购买一次
由于可怜是超市的忠实顾客,超市给了可怜 n n n张优惠券,其中第 i i i张优惠券可以让第 i i i样商品的售价减少 d i d_i di​
当然,可怜在使用优惠券时必须购买对应的商品
但是,优惠券的使用是有条件的
具体地,对于 i > 1 i>1 i>1,使用第 i i i张优惠券时必须先使用第 x i x_i xi​张优惠券
那么,可怜用这 b b b块钱最多可以购买多少商品呢?

输入格式

第一行两个整数 n , b n,b n,b
接下来 n n n行,第 i i i行描述第 i i i个商品及优惠券

  • 若 i = 1 i=1 i=1,则有两个整数 c i , d i c_i,d_i ci​,di​
  • 若 i > 1 i>1 i>1,则有三个整数 c i , d i , x i c_i,d_i,x_i ci​,di​,xi​

输出格式

输出一个整数,表示可怜最多可以购买多少商品。

样例

样例输入1

6 16
10 9
10 5 1
12 2 1
20 18 3
10 2 3
2 1 5

样例输出1

4

样例输入2

5 10
3 1
3 1 1
3 1 2
3 1 3
3 1 4

样例输出2

5

数据范围与提示

对于 30 % 30\% 30%的数据, n ⩽ 20 n\leqslant 20 n⩽20
对于 60 % 60\% 60%的数据, n ⩽ 300 n\leqslant 300 n⩽300
对于 100 % 100\% 100%的数据, 1 ⩽ n ⩽ 5000 , 1 ⩽ b ⩽ 1 0 9 , 1 ⩽ d i < c i ⩽ 1 0 9 , 1 ⩽ x i < i 1 \leqslant n \leqslant 5000,1 \leqslant b \leqslant 10^9,1 \leqslant d_i < c_i \leqslant 10^9,1 \leqslant x_i < i 1⩽n⩽5000,1⩽b⩽109,1⩽di​<ci​⩽109,1⩽xi​<i

题解

这道题主要的难点在于处理“使用第 i i i张优惠券时必须先使用第 x i x_i xi​张优惠券”这个问题
这非常容易让我们联想到树,我们把 i i i向 x i x_i xi​连一条边,就可以构成一棵树
然后就很容易想到可以使用树形DP了
我们用 f i , j , k f_{i,j,k} fi,j,k​表示第 i i i个节点,买了 j j j个,用( k = 1 k=1 k=1)还是没用( k = 0 k=0 k=0)优惠券
简单计算一下,就可以得出递推式:
f x , j + k , 0 = m i n ( f x , j + k , 0 , f x , j , 0 + f y , k , 0 ) f_{x,j+k,0}=min(f_{x,j+k,0},f_{x,j,0}+f_{y,k,0}) fx,j+k,0​=min(fx,j+k,0​,fx,j,0​+fy,k,0​)
f x , j + k , 1 = m i n ( f x , j + k , 1 , f x , j , 1 + m i n ( f y , k , 1 , f y , k , 0 ) ) f_{x,j+k,1}=min(f_{x,j+k,1},f_{x,j,1}+min(f_{y,k,1},f_{y,k,0})) fx,j+k,1​=min(fx,j+k,1​,fx,j,1​+min(fy,k,1​,fy,k,0​))
(其中, y y y为 x x x的子节点)
附上代码:

#include<algorithm>
#include<cstdio>
using namespace std;
int n,k,tot,t,ans,a[5010],b[5010],head[5010],nxt[5010],to[5010],size[5010];
long long f[5010][5010][2];
void add(int u,int v)
{nxt[++tot]=head[u],head[u]=tot,to[tot]=v;
}
void dfs(int x)
{f[x][0][0]=0,f[x][1][0]=a[x],f[x][1][1]=a[x]-b[x],size[x]=1;for(int i=head[x];i;i=nxt[i]){dfs(to[i]);for(int j=size[x];j>=0;j--) for(int k=0;k<=size[to[i]];k++){f[x][j+k][0]=min(f[x][j+k][0],f[x][j][0]+f[to[i]][k][0]);f[x][j+k][1]=min(f[x][j+k][1],f[x][j][1]+min(f[to[i]][k][1],f[to[i]][k][0]));}size[x]+=size[to[i]];}
}
int main()
{freopen("supermarket.in","r",stdin);freopen("supermarket.out","w",stdout);scanf("%d%d%d%d",&n,&k,&a[1],&b[1]);for(int i=2;i<=n;i++) scanf("%d%d%d",&a[i],&b[i],&t),add(t,i);for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) f[i][j][0]=f[i][j][1]=1e18;dfs(1);for(int i=n;i;i--) if(f[1][i][0]<=k||f[1][i][1]<=k){ans=i;break;}printf("%d",ans);
}

DTOJ3489 可怜与超市(supermarket)相关推荐

  1. 非常口語化的英語單詞,短句

    whats your asl? 你的,年龄,性别,地点? (聊天用的) how are you doing (or: how you doiin) 你好. whats up 什么事? 或是: 你好 l ...

  2. NOIP模拟测试5「星际旅行·砍树·超级树」

    星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...

  3. 公共场所常用英语标识

    第一部分医疗卫生 一. 警告提示信息 (一) 区域划分标识 序号 中文名称 英文名称 1. 就诊区 Outpatient Area 2. 住院区 Inpatient Area 3. 实验区 Exper ...

  4. [Python] 用K-means聚类算法进行客户分群

    目录 一.背景 1.项目描述 2.数据描述 二.相关模块 三.数据可视化 1.数据读取 2.数据可视化 2.1 平行坐标图 2.2 年龄/年收入/消费分数的分布 2.3 年龄/年收入/消费分数的柱状图 ...

  5. AB级 考试高频词 1000个

    AB级 考试高频词 1000个 1 能力 ability 46 申请 application 91 街区 block 2 在船上 aboard 47 欣赏;感激 appreciate 92 女衬衫 b ...

  6. 人智导(二十二):规划(下)

    人智导(二十二):规划(下) 部分有序的规划:实例 部分有序(Partial Order)的规划举例 问题:购买milk, banana, drill, 然后回家 SM: 超市(supermarket ...

  7. C++设计模式实践——线上购物系统

    项目源码:https://github.com/Pistachiout/DesignPattern 一.系统的主要目标与功能   在本次设计中,考虑到目前疫情反复不断,为了方便群众,超市都推出在线购物 ...

  8. [分享]杰.德.爱华兹(中国)软件 J.D. Edwards 在零售业解决方案

    J.D. Edwards 公司简介 美国J.D. Edwards公司创建于1977年,是世界领先的企业资源管理软件的开发商.总部位于美国丹佛的克罗拉多州,在全球拥有5636名员工.在世界各地设有49个 ...

  9. 口语学习Day7:今天聊聊美国超市的物价

    今天聊聊美国超市的物价 last week,I went grocery shopping at an Asian supermarket(上周.我去亚洲超市买东西) And some of you ...

最新文章

  1. 伪共享 FalseSharing (CacheLine,MESI) 浅析以及解决方案
  2. 1.13 实例:用户修改密码
  3. 推荐系统里的那些坑儿
  4. 项目管理excel_项目经理必备的6款项目管理软件
  5. 投资股权众筹项目,至少需要关注6个方面
  6. 开源jumpserver 堡垒机搭建
  7. pycharm和jupyter notebook中的快捷键
  8. 博弈论(一)基本概念
  9. 挑战程序设计竞赛第一章 笔记
  10. 卸载oracle10g教程,卸载Oracle10g步骤
  11. QScrollArea样式设置
  12. python异常值处理四分位法_Python清除异常值四分位法
  13. 17 张程序员专属壁纸(使用频率很高)
  14. 创龙TI Sitara列AM4376/AM4379 ARM Cortex-A9高性能低功耗处理器
  15. 关于人工智能不会使大脑变懒惰的议论文_自律,拒绝懒惰和放纵,不枉余生
  16. 手机web端唤醒qq客户端以及电脑web端唤醒qq客户端
  17. akka入门系列-0. 概述
  18. 那些年不容错过的115家硅谷IT公司
  19. MATLAB秦九韶多项式求值算法的原理和迭代法求解的近似数值方法。
  20. 关于黑马手机卫士的学习总结

热门文章

  1. [附源码]JSP+ssm计算机毕业设计消防安全宣传系统的设计与实现m18ot【源码、数据库、LW、部署】
  2. Vue--vant-cell单元格组件跳转路由的三种方式
  3. 影视建模与游戏建模的区别,哪个薪资发展更好?
  4. PixiJS学习(1)创建一个canvas
  5. TPYBoardv202自制微信远程智能温湿度计
  6. 华为matebook x pro笔记本换硬盘实战
  7. vs2019光标异常变成灰色方块的解决方法
  8. Qt系列文章001-Qt下载安装
  9. SpringCloud Alibaba Seata处理分布式事务-微服务(三十九)
  10. ios swift截取数组(Arrays)