Kronican

内存限制:32 MiB

时间限制:2000 ms

标准输入输出

题目类型:传统

评测方式:文本比较

上传者: cqbzgm

题目描述

Mislav有N个无限体积的杯子,每一个杯子中都有一些水。Mislav想喝掉所有的水,但他不想喝超过K杯水。Mistrav能做的就是将一个杯子中的水倒入另一个杯子中。 不幸的是,挑选哪两个杯子进行倒水操作对Mislav来说很重要,因为并非所有的杯子都离他一样远。更准确地说,从i号杯子向j号杯子倒水所付出的代价为Cij。 帮助Mislav找到他需要付出的总代价的最小值。

输入格式

第一行输入包含整数N和K(1≤K≤N≤20)。表示水杯的总数和Mislav最多能喝多少杯。 接下来N行每行包含N个整数Cij(0≤Cij≤1e5)。第i+1行的第j个整数表示从第i个杯子第j个杯子倒水所需要付出的代价。保证Cii等于0。

输出格式

输出一个整数。表示Mislav需要付出的总代价的最小值。

样例

样例输入1

3 3

0 1 1

1 0 1

1 1 0

样例输出1

0

样例输入2

3 2

0 1 1

1 0 1

1 1 0

样例输出2

1

样例输入3

5 2

0 5 4 3 2

7 0 4 4 4

3 3 0 1 2

4 3 1 0 5

4 5 5 5 0

样例输出3

5

数据范围与提示

对于40%的数据,N≤10。

这道题考场上我想到的居然是最小生成树(于是就成功的爆零了),如果加了特判的话就有80分,主要还是数据太水了吧。

下面就来讲讲正解呗,因为之前接触过状压DP,所以做起来还是比较顺。

一个二进制数\(0000\)表示4个水杯都装有水,\(0001\)表示第一个水杯是空的,代价最小的状态,同理,\(1000\)表示第4个水杯是空的,代价最小的状态。

现在来考虑状态转移,拿\(1000\)举例,不难发现它可以转移到。

  • \(1100\)
  • \(1010\)
  • \(1001\)

    (可以这么考虑,我们在\(1000\)这个状态下进行了一个将\(i\)杯子的水倒入了\(j\)的操作。不管\(i\)和\(j\)是多少,总会有一个杯子会空掉,所以会多出一个"1"出来)

因为每次操作只能在两个装有水的杯子\(i\)和\(j\)的杯子进行,所以我们只需要在当前状态\(1000\)里暴力枚举位数为\(0\)的\(i\)和\(j\),模拟将\(i\)倒入\(j\)的操作。因为\(i\)倒入了\(j\),所以第\(i\)位为1,权值为\(w_{ij}\)。

那么我们便可以得出状态转移方程:

\(f_{S+1<<i} = min(f_{S}+w_{ij})\)

S为当前状态,一个二进制数。当空的杯子,也就是S的1的个数为\(n-k\)时,我们便可以记录答案。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; #define N 30 int n,k,w[N][N],ans,inf,f[1<<21]; int main() {
memset(f,0x3f,sizeof(f));
ans=f[0];
cin>>n>>k;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
cin>>w[i][j];
f[0]=0;
for(int S=0;S<1<<n;S++) {
int sum=0;
for(int i=1;i<=n;i++) if(S & (1<<(i-1))) sum++;
if(sum==n-k) {
ans=min(ans,f[S]);
continue;
}
if(sum>n-k) continue;
for(int i=1;i<=n;i++)
if(!(S&(1<<(i-1))))
for(int j=1;j<=n;j++)
if(!(S & (1<<(j-1))) && i!=j)
f[S+(1<<(i-1))]=min(f[S+(1<<(i-1))],f[S]+w[i][j]);
}
cout<<ans;
}

模拟赛毒瘤状压DP题:Kronican的更多相关文章

  1. 7.12 NOI模拟赛 生成树 装压dp vector装压

    LINK:生成树 这场比赛我打的真失败 T3是比较容易的 却一直刚 那道"数论" 10分其实搜一下全排列. 30分容易想到对边进行装压dp. 不过存在一些细节 可以对于一个连通块的 ...

  2. 4.26 省选模拟赛 T3 状压dp 差分求答案

    LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...

  3. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  4. 2018.10.17 NOIP模拟 管道(状压dp)

    传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...

  5. 2018.09.08 NOIP模拟 division(状压dp)

    这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...

  6. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

  7. Contest Hunter 模拟赛09 C [树形dp+差分]

    题面 传送门 思路 又双叒叕是一道差分题我没想出来......记录一下 首先这个"所有祖先都比自己小"等价于"父亲比自己小" 这题的基础dp方程很显然,$dp[ ...

  8. 【NOIP模拟赛】超级树 DP

    这个题我在考试的时候把所有的转移都想全了就是新加一个点时有I.不作为II.自己呆着III.连一个IV.连接两个子树中的两个V连接一个子树中的两个,然而V我并不会转移........ 这个题的正解体现了 ...

  9. CSP模拟赛 Repulsed(树形DP)

    题面 ⼩ w ⼼⾥的⽕焰就要被熄灭了. 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树. 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个. 接下来每个节点都要被分配给 ...

随机推荐

  1. Python中包的定义

    简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空.__init__.py 用于标识当前文件夹是一个包. 实例子 test.pypackage_dc36 ...

  2. echarts柱状图个数多,横坐标名称过长显示不全解决方法

    当echarts柱状图个数多,横坐标名称过长时横坐标名称显示不全,网上并没有搜到太好的方法,于是自己加工了下,将横坐标名称显示前六位,当鼠标放到上面的时候显示全名,下面是示例代码,可以直接拷贝测试 代 ...

  3. 【JAVA】eclipse里代码整个前移或者后移的快捷键

    一整块后移是:选中按 tab 一整块前移是:选中按 shift+tab

  4. AOP记录日志

    1.自定义注解 @Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上 @Retention(RetentionPolicy.RUNTIME) ...

  5. SDK manager打不开解决办法

    在下载管理android SDK过程中,有时会出现SDK manager.exe打不开的情况,网上也罗列了各种解决办法,其中地址为http://blog.csdn.net/pipisorry/arti ...

  6. ios UIWebView加载HTMLStr图文,关于图片宽高设置,webView内容实际高度的踩坑问题

    一.关于UIWebView 与 WKWebView 选取问题 从发布时间看: 2008年7月11日,在新一代iPhone3G正式发售当天,iPhone OS 2.0(iOS 2.0)推出,这时候就有U ...

  7. KNN算法项目实战——改进约会网站的配对效果

    KNN项目实战——改进约会网站的配对效果 1.项目背景: 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可 ...

  8. (转)Centos7下杀毒软件clamav的安装和使用

    本文转载自:https://www.cnblogs.com/bingo1024/p/9018212.html#_label1_0 目录 一.yum安装 二.编译安装 2.1:下载软件包 2.2:创建c ...

  9. less:匹配模式

    相当于JS中的if(不完全是),满足条件后才能匹配 .margin(top, @width: 5px) { margin: @width 0 0 0; } .margin(right, @width: ...

  10. springboot+UEditor图片上传

    springboot+UEDitor百度编辑器整合图片上记录于此 1.下载ueditor插件包,解压到static/ueditor目录下 2.在你所需实现编辑器的页面引用三个JS文件 1)  uedi ...