分析:一道非常恶心的dp题.每个人要么选或不选,很像是0-1背包,可以套用背包问题的状态,但是因为题目要求3个值,所以可以再加一维表示3个答案.

f[i][j][k][l][p][0/1/2]表示i个守门员,j个后卫,k个中锋,l个前锋,花费是p,最后一维是0则表示不考虑队长的价值,1是方案数,2是队长价值.在这个状态表示里省去了一维表示前多少个人,其实就是一个滚动数组,递推的时候要倒序枚举.因为队长的价值会被算两边,所以队长肯定是价值最大的,先对所有人排个序,枚举到第i个人的时候,就让第i个人当队长就行了,不需要再去枚举.然后根据题目说的那样更新0/1/2就可以了.

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> using namespace std; const int mod = , inf = 0x7fffffff; int n, up[], down[], f[][][][][][], ans0, ans1 = inf, ans2;
int maxn; struct node
{
int id, v, c;
}e[]; bool cmp(node a, node b)
{
return a.v < b.v;
} void init()
{
up[] = ;
down[] = ;
up[] = ;
down[] = ;
up[] = ;
down[] = ;
up[] = ;
down[] = ;
} void update(int i, int j, int k, int l,int p,int fangan, int jiazhi, int duizhang)
{
if (f[i][j][k][l][p][] < jiazhi)
{
f[i][j][k][l][p][] = jiazhi;
f[i][j][k][l][p][] = ;
f[i][j][k][l][p][] = duizhang;
}
if (f[i][j][k][l][p][] == jiazhi && f[i][j][k][l][p][] < duizhang)
{
f[i][j][k][l][p][] = ;
f[i][j][k][l][p][] = duizhang;
}
if (f[i][j][k][l][p][] == jiazhi && f[i][j][k][l][p][] == duizhang)
{
f[i][j][k][l][p][] += fangan;
if (f[i][j][k][l][p][] >= mod)
f[i][j][k][l][p][] = mod;
}
} void gengxin(int x)
{
for (int i = up[] - (e[x].id == ); i >= ; i--)
for (int j = up[] - (e[x].id == ); j >= ; j--)
for (int k = up[] - (e[x].id == ); k >= ; k--)
for (int l = up[] - (e[x].id == ); l >= ; l--)
if (i + j + k + l < )
{
for (int p = maxn - e[x].c; p >= ; p--)
if (f[i][j][k][l][p][])
update(i + (e[x].id == ), j + (e[x].id == ), k + (e[x].id == ), l + (e[x].id == ), p + e[x].c,f[i][j][k][l][p][], f[i][j][k][l][p][] + e[x].v, e[x].v);
}
} int main()
{
init();
f[][][][][][] = -;
f[][][][][][] = ;
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
char s[];
scanf("%s", s + );
scanf("%d%d", &e[i].v, &e[i].c);
if (s[] == 'G')
e[i].id = ;
if (s[] == 'D')
e[i].id = ;
if (s[] == 'M')
e[i].id = ;
if (s[] == 'F')
e[i].id = ;
}
scanf("%d", &maxn);
sort(e + , e + + n,cmp);
for (int i = ; i <= n; i++)
gengxin(i);
for (int i = down[]; i <= up[]; i++)
for (int j = down[]; j <= up[]; j++)
for (int k = down[]; k <= up[]; k++)
for (int l = down[]; l <= up[]; l++)
if (i + j + k + l == )
for (int p = ; p <= maxn; p++)
if (f[i][j][k][l][p][])
{
int temp0 = f[i][j][k][l][p][] + f[i][j][k][l][p][];
int temp1 = p;
int temp2 = f[i][j][k][l][p][];
if (temp0 > ans0)
{
ans2 = ;
ans0 = temp0;
ans1 = temp1;
}
if (temp0 == ans0 && temp1 < ans1)
{
ans1 = temp1;
ans2 = ;
}
if (temp0 == ans0 && temp1 == ans1)
{
ans2 += temp2;
if (ans2 >= mod)
ans2 = mod;
}
}
printf("%d %d %d\n", ans0, ans1, ans2); return ;
}

noip模拟赛 党的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. [BZOJ 1698] 荷叶池塘

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1698 [算法] 最短路 [代码] #include<bits/stdc++.h ...

  2. Django总结二

    - 创建app应用与ORM操作 - Django项目project - app(应用) -> 不同的功能放在不同的app中 - 命令 : - 创建app python manage.py sta ...

  3. wordpress 你所不知道的固定链接设置方法,设置适合自己的个性固定链接,适合SEO

    %year% 年份,四位数字,例如2004年  %monthnum% 一年的月份,例如05  %day% 一个月的日子,例如28  %hour% 一天中的小时,例如15  %minute% 小时,例如 ...

  4. html5——:hover事件触发自己的:afert伪元素事件

    :hover事件触发自己的:afert伪元素事件中间是没有空格的

  5. Codeforces_733D

    D. Kostya the Sculptor time limit per test 3 seconds memory limit per test 256 megabytes input stand ...

  6. 吐得了,vue的多选组合框回显必须是字符串集合

    下面这个typeIdList,如果给他赋值,就能回显到页面,但是必须是字符串的集合,如果是数值类型的id,不好意思,请转成字符串

  7. ubuntu14.04禁用USB外存储设备

    ubuntu 14.04中禁用usb外存储设备: 在网上找了很多方法,大概都是下面的命令,而实际测试的时候没有什么作用. gsettings set org.gnome.desktop.media-h ...

  8. eclipse常用设置之项目分组查看

    1.打开‘NaviNavigator’ 视图,windows-->show views->NaviNavigator; 2.在NaviNavigator视图下选择select workin ...

  9. 默认ttl参考

    UNIX 及类 UNIX操作系统 ICMP 回显应答的 TTL 字段值为 255 Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64 WINXP-32bit 回显应答的 T ...

  10. Django - 内容总结(1)

    内容整理: 1.创建django工程名称 django-admin startproject 工程名 2.创建app cd 工程名 python manage.py startapp cmdb 3.静 ...