[原创] Karen and Supermarket 2
在回家的路上,凯伦决定到超市停下来买一些杂货。 她需要买很多东西,但因为她是学生,所以她的预算仍然很有限。
事实上,她只花了b美元。
超市出售N种商品。第i件商品可以以ci美元的价格购买。当然,每件商品只能买一次。
最近,超市一直在努力促销。凯伦作为一个忠实的客户,收到了n张优惠券。
如果凯伦购买i次商品,她可以用i次优惠券降低di美元。 当然,不买对应的商品,优惠券不能使用。
然而,对于优惠券有一个规则。对于所有i>=2,为了使用i张优惠券,凯伦必须买第j个商品。
凯伦想知道。她能在不超过预算B的情况下购买的最大商品数量是多少?
输入输出样例
输入样例#1: 复制
6 16
10 9
10 5 1
12 2 1
20 18 3
10 2 3
2 1 5
输出样例#1: 复制
4
Solution
考试题目写挂,看错题了。想看原题的戳这里。树型dp,我们定义\(f[i][j][2]\)代表i结点选了j个节点,当前节点选不选。容易想到dp方程为
\]
\]
\]
\]
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
    int to,next;
}a[1000100];
int w[101000],v[100100],len,last[101010],son[100010],tot;
int f[5100][5100][2];
void add(int a1,int a2)
{
    a[++len].to=a2;
    a[len].next=last[a1];
    last[a1]=len;
}
void dp(int x,int father)
{
    son[x]=1;
    for(int i=last[x];i;i=a[i].next)
    {
        int to=a[i].to;
        if(to==father)
        continue;
        dp(to,x);
        for(int k=son[x];k>=0;k--)
        for(int j=son[to];j>=0;j--)
        {
            f[x][k+j][0]=min(f[x][k+j][0],f[to][j][0]+f[x][k][0]);
            f[x][k+j][0]=min(f[x][k+j][0],f[to][j][1]+f[x][k][0]);
            f[x][k+j][1]=min(f[x][k+j][1],f[to][j][1]-v[to]+f[x][k][1]);
            f[x][k+j][1]=min(f[x][k+j][1],f[to][j][0]+f[x][k][1]);
        }
        son[x]+=son[to];
    }
}
int main()
{
    //freopen("shopping.in","r",stdin);
    //freopen("shopping.out","w",stdout);
    memset(f,0x3f,sizeof(f));
    int n,s,x;
    cin>>n>>s;
    cin>>w[1]>>v[1];
    w[1]-=v[1];
    f[1][0][0]=0;f[1][1][1]=w[1];
    for(int i=2;i<=n;i++)
    {
        scanf("%d%d%d",&w[i],&v[i],&x);
        add(x,i);add(i,x);
    }
    for(int i=2;i<=n;i++)
    f[i][0][0]=0,f[i][1][1]=w[i];
    dp(1,0);
    for(int i=n;i>=0;i--)
    {
        if(f[1][i][0]<=s||f[1][i][1]<=s)
        {cout<<i;return 0;}
    }
}
博主蒟蒻,可以随意转载,但必须附上原文链接k-z-j。
[原创] Karen and Supermarket 2的更多相关文章
- Codeforces 815C Karen and Supermarket 树形dp
		Karen and Supermarket 感觉就是很普通的树形dp. dp[ i ][ 0 ][ u ]表示在 i 这棵子树中选择 u 个且 i 不用优惠券的最小花费. dp[ i ][ 1 ][ ... 
- CF815C Karen and Supermarket
		题目链接 CF815C Karen and Supermarket 题解 只要在最大化数量的前提下,最小化花费就好了 这个数量枚举ok, dp[i][j][1/0]表示节点i的子树中买了j件商品 i ... 
- CF815C Karen and Supermarket [树形DP]
		题目传送门 Karen and Supermarket On the way home, Karen decided to stop by the supermarket to buy some gr ... 
- E. Karen and Supermarket
		E. Karen and Supermarket time limit per test 2 seconds memory limit per test 512 megabytes input sta ... 
- 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 ... 
- codeforces 815C Karen and Supermarket
		On the way home, Karen decided to stop by the supermarket to buy some groceries. She needs to buy a ... 
- codeforces round #419 E. Karen and Supermarket
		On the way home, Karen decided to stop by the supermarket to buy some groceries. She needs to buy a ... 
- Codeforces 815 C Karen and Supermarket
		On the way home, Karen decided to stop by the supermarket to buy some groceries. She needs to buy a ... 
- 【Codeforces 815C】Karen and Supermarket
		Codeforces 815 C 考虑树型dp. \(dp[i][0/1][k]\)表示现在在第i个节点, 父亲节点有没有选用优惠, 这个子树中买k个节点所需要花的最小代价. 然后转移的时候枚举i的一 ... 
随机推荐
- Kubernetes对象
			Kubernetes对象 在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等.Kubernets对象是一种持久化,表示集群状态的实体.它是一种声明式 ... 
- Redis的数据类型及相关操作命令
			redis 基础内容 —— redis的数据类型及相关操作的Linux命令.所谓大厦千层基础承载,希望大家认真学习这一讲: 一.redis 的五大数据类型: 1.String(字符串): 2.List ... 
- 如何解决maven archetype加载太慢的方法
			有时候在构建maven项目时,archetype加载不出来,一直在Retrieving archetype...,现象如下: 有两种解决方法: ①点击链接下载:http://files.cnblogs ... 
- java 数据库连接的几个步骤
			Class.forName("oracle.jdbc.driver.OracleDriver"); String url = "jdbc:oracle:thin:@你的主 ... 
- JCaptcha+Memcache的验证码集群实现
			一.问题背景 为了防止垃圾信息发布机器人的自动提交攻击,采用CAPTCHA验证码来保护该模块,提高攻击者的成本. 二.验证码简介 全自动区分计算机和人类的图灵测试(Completely Automat ... 
- 假几何真逆序数 NB HDU3465
			题意: 有n条直线,问他们两两在横坐标开区间(L,R)之间相交的个数 n=50000,暴力肯定就不用想了,如果在纸上画一画可以发现如果两条直线在(L,R)内相交,那么他们与x= L和x=R的交点序数是 ... 
- (1)git
			1.创建一个版本库 #创建一个文件夹 E:\>mkdir pythonGit #进入文件夹 E:\>cd pythonGit #把此目录创建成git版本库 E:\pythonGit> ... 
- chmod u g x o 777
			chmod [ugoa] [+-= ] [rwx] 文件或者是目录u:表示文件的属主,g:表文件的属组内的成员,o:则表示其它用户,a:是所有用户的(ugo的总和)+—=:是对权限的操作,+表示增加相 ... 
- C51单片机头文件和启动文件
			STARTUP.A51//启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数 <reg51.h> //特殊寄存器的字节地址和位地址,sfr定义字 ... 
- 51NOD 1424 零树
			Discription 有一棵以1为根的树,他有n个结点,用1到n编号.第i号点有一个值vi. 现在可以对树进行如下操作: 步骤1:在树中选一个连通块,这个连通块必须包含1这个结点. 步骤2:然后对这 ... 
