感觉也是一个小清新题。。

我们考虑设立状态 $Dp[i][s]$ 表示考虑了前 $i$ 个商店后,购买状态为 $s$ 的最小花费。

转移的话就枚举每个商店 $i$,首先令:

$$Dp[i][s] = Dp[i - 1][s] + D[i]$$

这个过程表示到达这个商店。

然后枚举每个状态 $s$,然后枚举每个不在 $s$ 里的物品 $j$,令:

$$Dp[i][s + \{j\}] = min(Dp[i][s + \{j\}], Dp[i][s] + Cost[i][j])$$

这个过程就相当于是进行了一次 01 背包。

最后还要令 $Dp[i][s] = min(Dp[i][s], Dp[i - 1][s])$ 看看在商店 $i$ 时的购买计划是否划算。

令全集是 $S$,那么最后答案就是 $Dp[n][S]$ 了。

时间复杂度 $O(nm2^m)$,空间复杂度 $O(n2^m)$。

 #include <cstdio>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define N 100 + 5
#define M 16 + 5
#define SIZE 1 << 16
#define INF 593119681 int n, m, W[N], Map[N][M], Dp[N][SIZE]; int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i ++)
{
scanf("%d", W + i);
for (int j = ; j <= m; j ++)
scanf("%d", Map[i] + j);
}
for (int s = ; s < ( << m); s ++)
Dp[][s] = INF;
Dp[][] = ;
for (int i = ; i <= n; i ++)
{
for (int s = ; s < ( << m); s ++)
Dp[i][s] = Dp[i - ][s] + W[i];
for (int j = ; j <= m; j ++)
for (int s = ; s < ( << m); s ++)
if ((s & ( << j - )) == )
Dp[i][s ^ ( << j - )] = min(Dp[i][s ^ ( << j - )], Dp[i][s] + Map[i][j]);
for (int s = ; s < ( << m); s ++)
Dp[i][s] = min(Dp[i][s], Dp[i - ][s]);
}
printf("%d\n", Dp[n][( << m) - ]); return ;
}

4145_Gromah

BZOJ 4145 [AMPPZ2014] The Prices 解题报告的更多相关文章

  1. BZOJ 4145: [AMPPZ2014]The Prices( 状压dp + 01背包 )

    我自己只能想出O( n*3^m )的做法....肯定会T O( nm*2^m )做法: dp( x, s ) 表示考虑了前 x 个商店, 已买的东西的集合为s. 考虑转移 : 先假设我们到第x个商店去 ...

  2. BZOJ.4145.[AMPPZ2014]The Prices(状压DP)

    BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f ...

  3. [BZOJ] 4145: [AMPPZ2014]The Prices

    设\(f[S][i]\)表示考虑到第\(i\)家店,已经买了集合\(S\)内的物品 一个朴素的想法是枚举子集转移 \[ f[S][i]=\min\{f[T][i-1]+cost[S\oplus T][ ...

  4. bzoj 4145: [AMPPZ2014]The Prices【状压dp】

    设f[s][i]为已经买了集合s,当前在商店i,转移的话就是枚举新买的物品,两种情况,一种是在原商店买,不用付路费,另一种是从其他商店过来,这种再枚举从那个商店过来是不行的,记一个mn[s]为已经买了 ...

  5. bzoj 1565 [NOI2009]植物大战僵尸 解题报告

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2161  Solved: 1000[Submit][Stat ...

  6. BZOJ 4029 [HEOI 4029] 定价 解题报告

    这个题好像也是贪心的感觉.. 我们枚举 $1,5,10,50,100,\dots$ ,找出在 $[l, r]$ 内能整除它们的最小的数. 然后找到其中在荒谬值最小的情况下数值最小的那个数, 就做完了. ...

  7. BZOJ 3998 [TJOI 2015] 弦论 解题报告

    这是一道后缀自动机经典题目. 对于 $t=0$ 的情况:每个节点都代表一个子串,所以我们给每个节点的 $Size$ 都记为 $1$, 对于 $t=1$ 的情况:我们只给 $last$ 节点的 $Siz ...

  8. BZOJ 3997 [TJOI 2015 组合数学] 解题报告

    这个题我脑洞了一个结论: 首先,我们定义满足以下条件的路径为“从右上到左下的路径”: 对于路径上任何不相同的两个点 $(x_1, y_1)$,$(x_2, y_2)$,都有: $x_1\neq x_2 ...

  9. BZOJ 3996 [TJOI 2015] 线性代数 解题报告

    首先,我们可以得到: $$D = \sum_{i=1}^{n}\sum_{j=1}^{n}a_i\times a_j\times b_{i,j} - \sum_{i=1}^{n}a_i\times c ...

随机推荐

  1. nginx、php-fpm、swoole HTTP/TCP压测对比

    本次测试是在win7下docker环境中进行压测,共创建一个nginx容器.一个php-fpm容器和一个swoole容器,客户端请求nginx服务器,nginx接收用户访问请求并转发给php-fpm, ...

  2. HTTP.Socket.TCP详解

    这会没事,整理了一下HTTP,socket,TCP之间的关系与区别,我们在面试的时候应该会经常问到这方面的东西,那么什么是HTTP呢? HTTP属于老话题了,在项目中我们经常需要往服务端发POST或者 ...

  3. ubuntu16.04 更换源

    1.备份 sudo cp /etc/apt/source.list /etc/apt/source.list.bak 2.打开/etc/apt/source.list,并删除所有内容 sudo ged ...

  4. ecshop,大商创后台支付系统修改模板

    初始模板 要求修改 增加了多个账户可供用户进行选择 解决方法 一找到要修改模板路径:即:http://dsctest.cn/admin/payment.php?act=edit&code=ba ...

  5. 【面试总结】网易2019秋招一站式面试总结(等offer中……)

    岗位:运维工程师(网易杭州) 面试时间:一天 上午十一点二十,准时开启面试,初面面试官是个看起来就像是主管的人,厚实的身体,中气浑厚的声音,整齐朴素的衬衫. 简要问题摘录如下:(后续补充答案内容) 1 ...

  6. CSUOJ 1018 Avatar

    Description In the planet Pandora, Jake found an old encryption algorithm. The plaintext, key and ci ...

  7. PHP中var_export和var_dump的区别

    var_dump -- 此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值. var_export -- 输出或返回一个变量的字符串表示, 它和 var_dump() 类似,不同的是其返回 ...

  8. QT学习笔记6:常见的 QGraphicsItem

    简述 QGraphicsItem 类是 QGraphicsScene 中所有 item 的基类. 它提供了一个轻量级的基础,用于编写自定义 item.其中包括:定义 item 的几何形状.碰撞检测.绘 ...

  9. python配置文件操作——configparser模块

    # -*- coding: utf-8 -*- ''' Version : Python27 Author : Spring God Date : 2012-4-26 Info : 配置文件ini所在 ...

  10. Codeforces Round #359 (Div. 1) A. Robbers' watch 暴力

    A. Robbers' watch 题目连接: http://www.codeforces.com/contest/685/problem/A Description Robbers, who att ...