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. Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论

    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...

  2. HDU 6538 Neko and quadrilateral(极角排序+旋转坐标系)

    这道题简直太好了,对于计算几何选手需要掌握的一个方法. 首先对于求解四边形面积,我们可以将四边形按对角线划分成两个三角形,显然此时四边形的面积最大最小值就变成了求解里这个对角线最近最远的点对. 对于此 ...

  3. C# 打印机连接状态判断

    原文:https://www.cnblogs.com/Old-Fish/p/6258118.html /// <summary> /// 判断是否连接打印机 /// </summar ...

  4. 攻防世界--simple-check-100

    测试文件:https://adworld.xctf.org.cn/media/task/attachments/2543a3658d254c30a89e4ea7b8950c27.zip 这道题很坑了, ...

  5. 基本SQL查询语句

    使用Emp表和Dept表完成下列练习 Emp员工表 empno ename job Mgr Hiredate Sal Comm Deptno 员工号 员工姓名 工作 上级编号 受雇日期 薪金 佣金 部 ...

  6. a标签实现下载canvas图片

    令 a 的 href = canvas.toDataURL("image/png");

  7. C++ CMake 入门实战[转载]

    C++ CMake 入门实战 2016-11-05 CMake用于跨平台的编译系统,对于通常的c/c++工程,都是通过make来进行编译的,CMake可以通过指令生成Makefile文件来指导整个项目 ...

  8. 黑客教父郭盛华:提升家庭WiFi的10个方法

    中国黑客教父,知名网络安全专家郭盛华曾发博文表示:“WiFi是互联网发展过程中最重要的发展之一,虚拟世界没有百分百的安全,所以杀毒软件并不可以抵抗全部的黑客攻击.“ 用户WiFi密码尽量不要使用简单单 ...

  9. Selenium-Switch与SelectApi介绍

    Switch 我们在UI自动化测试时,总会出现新建一个tab页面,弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了.需要用到Se ...

  10. 求能粘贴Word 内容(含图片)的在线编辑器

    word图片转存,是指UEditor为了解决用户从word中复制了一篇图文混排的文章粘贴到编辑器之后,word文章中的图片数据无法显示在编辑器中,也无法提交到服务器上的问题而开发的一个操作简便的图片转 ...