题目链接:http://codeforces.com/contest/816/problem/E

题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被使用,问初始金钱为b时 最多能买多少件商品? n<=5000,ci,di,b<=1e9

题解:显然是一道树形dp由于有两种情况就是当前点为根结点的时候选择打折还是不打折,如果选不打折之后的节点都不能打折。

不妨设dp[i][j][flag]表示i为根j为种类数,flag为状态表示选不选打折的最小花费。转移方程为

dp[u][j + l][0] = min(dp[u][j + l][0] , dp[u][j][0] + dp[v][l][0]);

dp[u][j + l][1] = min(dp[u][j + l][1] , min(dp[u][j][1] + dp[v][l][0] , dp[u][j][1] + dp[v][l][1]));

具体看代码。

#include <iostream>
#include <cstring>
#include <vector>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
const int M = 5e3 + 10;
vector<int>vc[M];
ll pa[M] , pb[M] , dp[M][M][2] , sz[M];
void dfs(int u) {
int len = vc[u].size();
sz[u] = 1;
dp[u][0][0] = 0 , dp[u][1][0] = pa[u] , dp[u][1][1] = pa[u] - pb[u];
for(int i = 0 ; i < len ; i++) {
int v = vc[u][i];
dfs(v);
for(ll j = sz[u] ; j >= 0 ; j--) {
for(ll l = 0 ; l <= sz[v] ; l++) {
dp[u][j + l][0] = min(dp[u][j + l][0] , dp[u][j][0] + dp[v][l][0]);
dp[u][j + l][1] = min(dp[u][j + l][1] , min(dp[u][j][1] + dp[v][l][0] , dp[u][j][1] + dp[v][l][1]));
}
}
sz[u] += sz[v];
}//这里看似是3个for实际上就是3个for但是复杂度却不是O(n^3),由于sz[i]表示的是以i为根的最多有几个子节点类似前缀的一种东西,由于dfs,这些sz只会用一次不会有重复。所以理论上复杂度就是O(n^2)。
}
int main() {
int n , b;
scanf("%d%d" , &n , &b);
for(int i = 1 ; i <= n ; i++) {
int c , d , x;
if(i == 1) {
scanf("%d%d" , &c , &d);
pa[i] = c , pb[i] = d;
}
else {
scanf("%d%d%d" , &c , &d , &x);
pa[i] = c , pb[i] = d;
vc[x].push_back(i);
}
}
memset(dp , inf , sizeof(dp));
dfs(1);
int ans = 0;
for(int i = 0 ; i <= n ; i++) {
if(dp[1][i][0] <= b || dp[1][i][1] <= b) ans = i;
}
printf("%d\n" , ans);
return 0;
}

codeforces 816 E. Karen and Supermarket(树形dp)的更多相关文章

  1. Codeforces 815C Karen and Supermarket 树形dp

    Karen and Supermarket 感觉就是很普通的树形dp. dp[ i ][ 0 ][ u ]表示在 i 这棵子树中选择 u 个且 i 不用优惠券的最小花费. dp[ i ][ 1 ][ ...

  2. Codeforces Round #419 (Div. 1) C. Karen and Supermarket 树形DP

    C. Karen and Supermarket     On the way home, Karen decided to stop by the supermarket to buy some g ...

  3. CF815C Karen and Supermarket [树形DP]

    题目传送门 Karen and Supermarket On the way home, Karen decided to stop by the supermarket to buy some gr ...

  4. 816E. Karen and Supermarket 树形DP

    LINK 题意:给出n个商品,除第一个商品外,所有商品可以选择使用优惠券,但要求其前驱商品已被购买,问消费k以下能买几个不同的商品 思路:题意很明显就是树形DP.对于一个商品有三种选择,买且使用优惠券 ...

  5. [CF816E] Karen and Supermarket1 [树形dp]

    传送门 - > \(CF816E\) Karen and Supermarket 题意翻译 在回家的路上,凯伦决定到超市停下来买一些杂货. 她需要买很多东西,但因为她是学生,所以她的预算仍然很有 ...

  6. Codeforces 219D - Choosing Capital for Treeland(树形dp)

    http://codeforces.com/problemset/problem/219/D 题意 给一颗树但边是单向边,求至少旋转多少条单向边的方向,可以使得树上有一点可以到达树上任意一点,若有多个 ...

  7. codeforces 633F The Chocolate Spree (树形dp)

    题目链接:http://codeforces.com/problemset/problem/633/F 题解:看起来很像是树形dp其实就是单纯的树上递归,就是挺难想到的. 显然要求最优解肯定是取最大的 ...

  8. codeforces 486 D. Valid Sets(树形dp)

    题目链接:http://codeforces.com/contest/486/problem/D 题意:给出n个点,还有n-1条边的信息,问这些点共能构成几棵满足要求的树,构成树的条件是. 1)首先这 ...

  9. Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]

    题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...

随机推荐

  1. 【Android】No resource found that matches the given name 'Theme.Sherlock.Light.NoActionBar'

    被这个问题困扰了好久…… 错误如下: error: Error retrieving parent for item: No resource found that matches the given ...

  2. codeforces 371A K-Periodic Array

    很简单,就是找第i位.i+k位.i+2*k位...........i+m*k位有多少个数字,计算出每个数出现的次数,找到出现最多的数,那么K-Periodic的第K位数肯定是这个了.这样的话需要替换的 ...

  3. java并发程序和共享对象实用策略

    java并发程序和共享对象实用策略 在并发程序中使用和共享对象时,可以使用一些实用的策略,包括: 线程封闭 只读共享.共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它.共享的只读对象包括不 ...

  4. MRCPv2在电信智能语音识别业务中的应用

    1. MRCPv2协议简介 媒体资源控制协议(Media Resource Control Protocol, MRCP)是一种基于TCP/IP的通讯协议,用于客户端向媒体资源服务器请求提供各种媒体资 ...

  5. css3加js做一个简单的3D行星运转效果

    前几天在园子里看到一篇关于CSS3D行星运转的文章,原文在这里,感觉这个效果也太酷炫了,于是自己也就心血来潮的来尝试的做了一下.因为懒得去用什么插件了,于是就原生的JS写,效果有点粗超,还有一些地方处 ...

  6. React 如何搭建脚手架

    React 如何搭建脚手架   npm install -g create-react-app    //安装 create-react-app react-demo    // react-demo ...

  7. kali Metasploit 连接 Postgresql 默认密码

    使用 metasploit 时, 1. 启动 postgresql service postgresql start 2. 自行测试 postgresql 是否安装成功 根据需要,自行 修改 post ...

  8. String——字符串

    首先看一下string的一部分源码吧 public final class String private final char value[]; 我们暂且只看这两行, 第一行String被final修 ...

  9. 使用webstorm调试node.js

    折腾半天,还是webstorm顺手,但也遇到一些小问题. 1.代码补全问题 nodeJS自身的补全 File->Project Setting->JavaScript->Librar ...

  10. pull解析案例

    此pull解析案例是eclipes的对不对,不知道, private void getXml() { try { InputStream is = getAssets().open("new ...