题目描述

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需要付出的总代价的最小值。

样例输入

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

样例输出

5

解题思路

n比较小,每个杯子只有有水无水两种情况,可用01字符串表示,很明显看出来状压了。

然而当时考我还不会。看着这道题我以为是最小生成树,然而后面发现不对劲,因为有些点你倒出去的不可能再有其他杯子倒进来,这样不可能最优。也不可能还可以倒到另外一些杯子,所以最小生成树是有问题的。当时没管这么多,搞了个裸的最小生成树,想要骗分,一开始本来写了判断点可不可以再连边的,后面删了,然而旁边那个人没删,骗了80分......

讲正解了。

其实也挺容易

其实就相当于在s状态下把i号杯子的水倒入j号杯子。

那么s是啥,在本题s状态其实就是一个二进制数用十进制表示的状态,0表示当前杯子无水,1表示当前杯子有水。

所有杯子所组成的状态便是s

举个例子

如果共有6个杯子 1 3 5 号有水,其余无水。那么整个二进制便是010101(从6到1连起来)

十进制数便是21。

dp差不多是这样,但这个dp好像挺难实现的。写法其实感觉挺奇葩的,很不能理解。

如果你用1表示有水的话

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
int n,k,a[25][25];
int dp[2000005],ans = 0x3f3f3f3f;
int check(int x){int ret = 0;while (x){if (x % 2)ret ++;x /= 2;}return ret;
}
int main(){scanf ("%d%d",&n,&k);for (int i = 1;i <= n;i ++)for (int j = 1;j <= n;j ++)scanf ("%d",&a[i][j]);memset(dp,0x3f,sizeof(dp));dp[(1 << n) - 1] = 0;//都有水,花费为0for (int s = (1 << n) - 1;s >= 1;s --){//枚举当前状态(2进制01表示,这里转换为10进制)for (int i = 0;i < n;i ++){//要倒出的杯子if ((s & (1 << i))){//当前状态下,倒出杯子中的水不为空for (int j = 0;j < n;j ++){if (i != j && (s & (1 << j))){//当前状态下,倒入杯子处的水不为空(为空无意义)并且不相同。dp[s - (1 << i)] = min(dp[s - (1 << i)],dp[s] + a[i + 1][j + 1]);//状态转移}}}}}for (int s = 0;s < (1 << n);s ++){//找答案if (check(s) == k)ans = min(ans,dp[s]);}printf("%d",ans);
}

如果1表示无水的话

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
int n,k,a[25][25];
int dp[2000005],ans = 0x3f3f3f3f;
int check(int x){int ret = 0;while (x){if (x % 2)ret ++;x /= 2;}return ret;
}
int main(){scanf ("%d%d",&n,&k);for (int i = 1;i <= n;i ++)for (int j = 1;j <= n;j ++)scanf ("%d",&a[i][j]);for (int i = 1;i < (1 << n);i ++)//边界,dp[0] = 0dp[i] = 0x3f3f3f3f;for (int s = 0;s < (1 << n);s ++){//枚举当前状态(2进制01表示,这里转换为10进制)for (int i = 0;i < n;i ++){//要倒出的杯子if (!(s & (1 << i))){//当前状态下,倒出杯子中的水不为空for (int j = 0;j < n;j ++){if (i != j && !(s & (1 << j))){//当前状态下,倒入杯子处的水不为空(为空无意义)并且不相同。dp[s^(1 << i)] = min(dp[s^(1 << i)],dp[s] + a[i + 1][j + 1]);//状态转移}}}}}for (int s = 0;s < (1 << n);s ++){if (check(s) == n - k)ans = min(ans,dp[s]);}printf("%d",ans);
}

[第三场T3]Kronican相关推荐

  1. 一天三场签约,百度Apollo智能交通这速度,真快!

    允中 发自 凹非寺  量子位 报道 | 公众号 QbitAI 百度Apollo的无人车,长沙的盆友坐了都说稳. 但Apollo另外这个"车",可有点快. 这个车是"智能交 ...

  2. 商业实战第三场 电视直销好记星

    视频地址:[url]http://win.cn.yahoo.com/070829/16/nmcn.html[/url] 7月2日,<赢在中国>商业实战将展开第三场的较量,商业任务为通过橡果 ...

  3. Codeforces Round #596 (Div. 2)(第三场)

    Preface 我要开始打Codeforces了,这是我的第三场比赛,本来以为可以快速上分的,谁知在pupil的路上越走越远. 本场战绩: Cost Time: 2 hours Solved: 1.5 ...

  4. 球迷福利!Next VR本周将直播三场ICC比赛

    最近,Next VR透露了与Relevent Sports的VR直播合作计划. NextVR,全球唯一能够提供深度信息和沉浸感的360度视频内容的公司,拥有价值18万美元的红龙摄像机系统,全球独一无二 ...

  5. 攻防世界base除4_CCTV5周末看点:周六!女足世界杯1/4决赛连战三场;周日!中超15轮国安碰鲁能...

    这个周末(6.28-6.30),CCTV-5 精彩节目与您相伴,激烈赛事邀您观看,本周末频道看点: ❶女足世界杯1/4决赛,本周六将连战三场 2019年女足世界杯愈演愈烈,本周末1/4决赛将先后迎来三 ...

  6. 2019年的第三场LiveVideoStackCon有何不同?

    LiveVideoStack团队出品,12月13-14日深圳见. 文 / 包研 12月13-14日,今年第三场LiveVideoStackCon将在深圳举行,此前的4月和8月,LiveVideoSta ...

  7. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他...

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  8. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

  9. 牛客网暑期ACM多校训练营(第三场)

    牛客网暑期ACM多校训练营(第三场) A. PACM Team 01背包,输出方案,用bool存每种状态下用的哪一个物品,卡内存.官方题解上,说用char或者short就行了.还有一种做法是把用的物品 ...

最新文章

  1. HDFS_API基本应用
  2. 软件项目开发流程及配置人员
  3. 数据中台推荐系统入门(三):推荐系统的评测指标
  4. 更改SQL Server表所有者的操作方法
  5. 【STM32】位带原理分析和应用
  6. 杭州电子科技大学保研计算机,杭州电子科技大学计算机学院计算机科学与技术(一级学科)保研细则...
  7. 星外主机销售系统源码_业务员大客户销售订货订单管理系统源码开发外包解析...
  8. C#写Windows系统日志(EventLog)
  9. 在 Java 虚拟机上班是一种怎样的体验?
  10. Google提供的ADB工具包下载地址
  11. 中小学数字化标准音乐教室建设及设备配套方案
  12. AMOS分析技术:路径分析的非递归模型
  13. 世嘉MD游戏开发进阶篇【二】:C语言实现有限状态机
  14. E: 无法定位软件包
  15. 一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!
  16. 如何提高深度学习的泛化能力?
  17. Rosalind Java| Counting Point Mutations
  18. 基于端口号的虚拟主机配置
  19. Windows 7 新功能 - BitLocker To Go
  20. 如何运用ERP做好销售管理?

热门文章

  1. MapReduce实现二次排序续(十)
  2. Zemax中坐标轴(系)
  3. The import javax.persistence cannot be resolved
  4. mySQL主表与子表一对多关系,left join关联查询子表中其中一条记录
  5. step26 heat conduction theta scheme
  6. STC15系列读取DS18B20温度传感器串口显示代码
  7. 50 行 C++ 代码,助你实现梦幻桌面
  8. C语言__eallow()和__edis()、if和#if、ASSERT()的区别(基于DSP)
  9. SAP CA02删除了工艺路线的工序,但是在表PLPO里没有删除记录,在表PLAS里才有。(疑似系统BUG)(查询函数 CARO_ROUTING_READ)
  10. 电脑优化软件测试大乐,是吹嘘还是真有用?NV游戏优化软件测试