zoukankan      html  css  js  c++  java
  • 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    题目

    Description

    农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可是后来他发现奶牛们玩游戏之后比原先产更多的奶。很明显,这是因为满足的牛会产更多的奶。
    但是,奶牛们在哪个才是最好的游戏平台这个问题上产生了巨大的分歧。一只奶牛想要买一台Xbox 360来跑《光晕3》;另外一只奶牛想要一台任天堂Wii来跑《任天堂明星大乱斗X》;第三只奶牛想要在PlayStation 3上面玩《潜龙谍影4》,顺便还能看某些高画质的日本电影。
    FJ想要在给定的预算内购入一些游戏平台和一些游戏,使他的奶牛们生产最多的奶牛以养育最多的孩子。
    FJ研究了N(1 <= N <= 50)种游戏平台,每一种游戏平台的价格是P_i(1 <= P_i <= 1000),并且每一种游戏平台有G_i(1 <= G_i <= 10)个只能在这种平台上运行的游戏。很明显,奶牛必须先买进一种游戏平台,才能买进在这种游戏平台上运行的游戏。每一个游戏有一个游戏的价格GP_j(1 <= GP_j 价格 <= 100)并且有一个产出值PV_j(1 <= PV_j<= 1000000),表示一只牛在玩这个游戏之后会产出多少牛奶。
    最后,农夫约翰的预算为V(1 <= V <= 100000),即他最多可以花费的金钱。请帮助他确定应该买什么游戏平台和游戏,使得他能够获得的产出值的和最大。
    考虑下面的数据,有N种游戏平台,并且有V=800 预算
    第一种游戏平台花费300并且有两个游戏,价格分别为30和25,它们的产出值如下所示:

    游戏 #花费 产出值
    1 30 50
    2 25 80

    第二种平台价格为600,并且只有一种游戏:

    游戏 #花费 产出值
    1 50 130

    第三种平台价格为400,并且有三种游戏:

    游戏 #花费 产出值
    1 40 70
    2 30 40
    3 35 60
    农夫约翰应该买第1和第3种平台,并且买平台1的游戏2,还有平台3的游戏1和游戏3。使得最后他最后的产出值最大,为210
    预算: 800
    平台 1 -300
    游戏 2 -25 80
    平台 3 -400
    游戏 1 -40 70
    游戏 3 -35 60
    -------------------------------------------
    总计: 0 (>= 0) 210

    Input

    第1行: 两个由空格隔开的整数: N和V
    第2到第N+1行: 第i+1行表示第i种游戏平台的价格和可以在这种游戏平台上面运行的游戏。包含: P_i, G_i还有G_i对由空格隔开的整数GP_j, PV_j

    Output

    第1行: 农夫约翰在预算内可以得到的最大的产出值。

    Sample Input

    3 800
    300 2 30 50 25 80
    600 1 50 130
    400 3 40 70 30 40 35 60

    Sample Output

    210

    题解

    题意

    (n)个平台,每个平台内有一些游戏
    每个平台需要一定价格,每个游戏也需要一定价格,也给予一定价值
    问在不超过预算的前提下的最大价值

    分析

    易想到DP
    (f[i][j])表示第(i)个平台花了(j)元的最大价值

    变量:
    (p)表示当前平台价格
    (v)表示预算
    (x)表示游戏价格
    (y)表示游戏价值

    对于当前平台(i)
    可以选择买平台而不买游戏
    (f[i][j]=f[i-1][j-p])(j)(p)~(v)
    然后对于当前平台做一次01背包
    最后可能没有不买这个平台优
    (f[i][j]=max(f[i][j],f[i][j-1]))

    比赛总结

    比赛的时候想到了DP
    但是觉得可能是我不会的DP就放弃了
    实际上十分简单
    不能知难而退,应该知难而进

    Code

    #include<bits/stdc++.h>
    using namespace std;
    int n,v,p,t,x,y,f[55][100005];
    int read()
    {
    	int res=0;char ch=getchar();
    	while (ch<'0'||ch>'9') ch=getchar();
    	while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch-'0'),ch=getchar();
    	return res;	
    }
    int main()
    {
    	freopen("vidgame.in","r",stdin);
    	freopen("vidgame.out","w",stdout);
    	n=read();v=read();
    	for (int i=1;i<=n;++i)
    	{
    		p=read();t=read();
    		for (int j=p;j<=v;++j) f[i][j]=f[i-1][j-p];
    		for (int j=1;j<=t;++j)
    		{
    			x=read();y=read();
    			for (int j=v;j>=x+p;--j) f[i][j]=max(f[i][j],f[i][j-x]+y);
    		}
    		for (int j=0;j<=v;++j) f[i][j]=max(f[i][j],f[i-1][j]);
    	}
    	printf("%d
    ",f[n][v]);
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    002使用代码和未经编译的XMAL文件创建WPF程序
    001使用代码创建WPF应用程序
    制作地图PPT
    数据库基本知识学习(sql server)
    虚拟现实技术对人类是福还是祸?
    计算机中的数学
    软件架构
    extracts
    bootstrap
    omron欧姆龙自动化应用
  • 原文地址:https://www.cnblogs.com/Livingston/p/13696388.html
Copyright © 2011-2022 走看看