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

我们考虑设立状态 $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. hdoj1203 I NEED A OFFER!(DP,01背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1203 思路 求最少能收到一份offer的最大概率,可以先求对立面:一份offer也收不到的最小概率,然 ...

  2. FILE operattion

    #include "mainwindow.h"#include "ui_mainwindow.h"#include <QMessageBox>#in ...

  3. NetworkX 使用(三)

    官方教程 博客:NetworkX NetworkX 使用(二) Introduction to Graph Analysis with NetworkX %pylab inline import ne ...

  4. python 创建项目

    项目骨架 nose 测试框架 Windows 10 配置 创建骨架项目目录 Windows 10 的 PowerShell mkdir projects cd projects/ mkdir skel ...

  5. 【mysql】当where后接字符串,查询时会发生什么?

    好久没有研究一个“深层次”的问题了. 首先来看我们为什么要讨论这个问题~ 首先这是一个正常的数据库查询,我们可以看到在ruizhi数据库里的chouka表内,所有数据如图. 现在,我们运行查询: se ...

  6. MySQL Insert语句单个批次数量过多导致的CPU性能问题分析

    [问题] 最近有台服务器比较频繁的CPU报警,表现的特征有CPU sys占比偏高,大量慢查询,大量并发线程堆积.后面开发对insert的相关业务限流后,服务器性能恢复正常. [异常期间线程处理情况] ...

  7. java中的dao模式

    java中Dao模式   什么是DAO   1.Data Access Object(数据存取对象) 2.位于业务逻辑和持久化数据之间 3.实现对持久化数据的访问 DAO模式的作用 1隔离业务逻辑代码 ...

  8. Android 使用ViewPager 做的半吊子的图片轮播

    Android 使用ViewPager 做的半吊子的图片轮播 效果图 虽然不咋样,但是最起码的功能是实现了,下面我们来一步步的实现它. 界面 下面我们来分析一下界面的构成 整体的布局: 因为我们要做出 ...

  9. Django的Form机制小问题

    使用Django,我们可以以声明式的方式来定义一个Form,如下: 1 2 3 4 5 # -*- coding: utf-8 -*- from django import forms class S ...

  10. 使用multiprocessing中的常见问题

    在python的解释器中,CPython是应用范围最广的一种,其具有丰富的扩展包,方便了开发者的使用.当然CPython也不是完美的,由于全局解释锁(GIL)的存在,python的多线程可以近似看作单 ...