题意

你有\(n\)个物品,物品和硬币有\(A\),\(B\)两种类型,假设你有\(M\)个\(A\)物品和\(N\)个\(B\)物品

每一轮你可以选择获得\(A, B\)硬币各\(1\)个,或者(硬币足够)花\(\max(a_i - M, 0)\)个\(A\),\(\max(b_i - N, 0)\)个\(B\)买\(i\)这个物品

问买到所有物品最少要多少轮

题解

巧妙的\(dp\),考虑间接设计状态

\(f[S][A] = B\)表示\(S\)这个集合买过了,\(A\)类花\(\sum a_i-A\)个硬币, \(B\)类花\(\sum b_i - B\)个硬币,这里的\(B\)取最大值

考虑可以先凑硬币,所有物品都最后买,统计一下答案

#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std; const int N = 16;
const int M = N * N + 5; int n, suma, sumb, t[N], lg[1 << N], a[N], b[N];
int cnta[1 << N], cntb[1 << N], f[1 << N][M]; int main() {
scanf("%d", &n); char s[10];
for(int i = 0; i < n; i ++) {
scanf("%s%d%d", s, a + i, b + i);
if(*s == 'R') t[i] = 0;
if(*s == 'B') t[i] = 1;
suma += a[i]; sumb += b[i];
}
for(int i = 0; i < n; i ++) {
lg[1 << i] = i;
}
for(int i = 1; i < (1 << n); i ++) {
cnta[i] = cnta[i & (i - 1)] + (t[lg[i & (-i)]] == 0);
cntb[i] = cntb[i & (i - 1)] + (t[lg[i & (-i)]] == 1);
}
memset(f, -1, sizeof f); f[0][0] = 0;
for(int S = 0; S < (1 << n); S ++) {
for(int j = 0; j <= 120; j ++) if(~ f[S][j]) {
for(int i = 0; i < n; i ++) if(!(S >> i & 1)) {
int &dp = f[S | (1 << i)][j + min(a[i], cnta[S])];
dp = max(dp, f[S][j] + min(b[i], cntb[S]));
}
}
}
int ans = 2e9;
for(int i = 0; i <= 120; i ++) {
if(~ f[(1 << n) - 1][i]) {
ans = min(ans, max(suma - i, sumb - f[(1 << n) - 1][i]));
}
}
printf("%d\n", ans + n);
return 0;
}

「CF744C」Hongcow Buys a Deck of Cards「状压 DP」的更多相关文章

  1. Codeforces 744C. Hongcow Buys a Deck of Cards(状压DP)

    这题的难点在于状态的设计 首先显然是个状压,需要一维表示卡的状态,另一维如果设计成天数,难以知道当前的钱数,没法确定是否能够购买新的卡,如果设计成钱数,会发现状态数过多,空间与时间都无法承受.但是可以 ...

  2. codeforces 744C Hongcow Buys a Deck of Cards

    C. Hongcow Buys a Deck of Cards time limit per test 2 seconds memory limit per test 256 megabytes in ...

  3. Codeforces 744C Hongcow Buys a Deck of Cards 状压dp (看题解)

    Hongcow Buys a Deck of Cards 啊啊啊, 为什么我连这种垃圾dp都写不出来.. 不是应该10分钟就该秒掉的题吗.. 从dp想到暴力然后gg, 没有想到把省下的红色开成一维. ...

  4. Codeforces Round #385 (Div. 1) C. Hongcow Buys a Deck of Cards

    地址:http://codeforces.com/problemset/problem/744/C 题目: C. Hongcow Buys a Deck of Cards time limit per ...

  5. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

  6. Hongcow Buys a Deck of Cards CodeForces - 744C (状压)

    大意: n个红黑卡, 每天可以选择领取一块红币一块黑币, 或者买一张卡, 第$i$张卡的花费红币数$max(r_i-A,0)$, 花费黑币数$max(b_i-B,0)$, A为当前红卡数, B为当前黑 ...

  7. Codeforces 745E Hongcow Buys a Deck of Cards 状压DP / 模拟退火

    题意:现在有n张卡片(n <= 16), 每一轮你可以执行两种操作中的一种.1:获得一张红色令牌和一张蓝色令牌.2:购买一张卡片(如果可以买的话),购买的时候蓝色卡片可以充当蓝色令牌,红色同理, ...

  8. ☆ [POJ2411] Mondriaan's Dream 「状压DP」

    传送门 >Here< 题意:用1*2的砖块铺满n*m的地板有几种方案 思路分析 状压经典题! 我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数. ...

  9. 「BZOJ 5010」「FJOI 2017」矩阵填数「状压DP」

    题意 你有一个\(h\times w\)的棋盘,你需要在每个格子里填\([1, m]\)中的某个整数,且满足\(n\)个矩形限制:矩形的最大值为某定值.求方案数\(\bmod 10^9+7\) \(h ...

随机推荐

  1. 2015年SCI收录遥感期刊28种目录

    链接地址:http://blog.sciencenet.cn/blog-57081-928025.html

  2. 第一篇:Git操作详解

    最近由于项目的需要,我需要负责整个项目的托管,其中涉及到很多Git相关的命令,所以就将之前用到的git相关的命令做了一个总结和归纳.由于开发环境是Linux,所以我接下来的操作命令均针对Linux环境 ...

  3. Array对象(一)

    Array是JavaScript中的一个事先定义好的对象(也可以称作一个类),可以直接使用. 创建Array对象: var array = new Array(); 创建指定元素个数的Array对象: ...

  4. 关于React前端构建的一般过程 - 理论篇

    概要 本文以个人阅读实践经验归纳前端架构构建过程,以Step by Step方式说明创建一个前端项目的过程.并会对每个阶段所使用的技术进行可替代分析,如Express替换Hapi或者Koa的优缺点分析 ...

  5. python中的enumerate()函数用法

    enumerate函数用于遍历序列中的元素以及它们的下标,可以非常方便的遍历元素. 比如我在往excel中写数据时就用到了这个函数: data = [] data.append(('预约码', '车牌 ...

  6. [转]angularjs的provider~ (Provider, Value, Constant, Service, Factory, Decorator)

    用AngularJS做项目,但凡用过什么service啊,factory啊,provider啊,开始的时候晕没晕?!晕没晕?!感觉干的事儿都差不多啊,到底用哪个啊?!别告诉我你们几个就是为了跟我炫耀兄 ...

  7. nginx与apache 限制ip连接数和带宽方法

    今天有个人问我,nginx怎么限制ip连接数,突然想不起来了,年龄大了,脑子不怎么好使了.还要看一下配置才想起了.那个人又问我,你测试过的吗?一下子把我问蒙了,我真没测试过了,也不知道启作用了没有. ...

  8. uboot 命令使用教程(uboot参数设置)

    1. Printenv 打印环境变量. uboot> printenv baudrate=115200 ipaddr=192.168.0.111 ethaddr=32:34:46:78:9A:D ...

  9. CentOS配置LDAP服务器

    环境:centos 5.8 安装: 1.yum安装oepnldap.openldap-servers.openldap-clients.openldap-devel [root@hao-linux ~ ...

  10. python的gzip库使用方法

    解压gzip文件示例: import gzip f = gzip.open('file.txt.gz', 'rb') file_content = f.read() f.close() 创建gzip文 ...