HDU 5937 Equation(DFS+剪枝)
题目链接 Equation
给定1-9这9个数字各自的卡片数,求能构成形如$i + j = k$的等式个数
等式中$i,j,k$必须都为个位数
若两个等式中$i,j,k$不完全相等,则这两个等式为不同的等式。
打表发现符合题意的等式有36个
那么通过01搜索状态数为$2^{36}$
TLE
我们求出若答案为36,每张卡片需求量$f[i]$
每次读入$a[i]$的时候
若对$i(1 <= i <= 9)$, 都有$a[i] >= f[i]$
则直接输出36
DFS的时候x为当前的等式用/不用
cnt为$1$到$x - 1$中用的等式个数
ans为当前保存答案的最大值
则当$cnt + 36 - x + 1 <= ans$的时候,剪枝
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; struct node{
int x, y, z;
} c[105];
int et = 0;
int f[11];
int a[11];
int ans;
int T;
int ca = 0;
vector <int> v; void dfs(int x, int cnt){
if (cnt + et - x + 1 <= ans) return;
if (x > et){
ans = max(ans, cnt);
return;
} dfs(x + 1, cnt); --a[c[x].x];
--a[c[x].y];
--a[c[x].z]; if (a[c[x].x] >= 0 && a[c[x].y] >= 0 && a[c[x].z] >= 0){
dfs(x + 1, cnt + 1);
++a[c[x].x];
++a[c[x].y];
++a[c[x].z];
} else{
++a[c[x].x];
++a[c[x].y];
++a[c[x].z];
} } int main(){ rep(i, 1, 9) rep(j, 1, 9) rep(k, 1, 9){
if (i + j == k){
++et;
c[et].x = i;
c[et].y = j;
c[et].z = k;
++f[i], ++f[j], ++f[k];
}
} scanf("%d", &T);
while (T--){
printf("Case #%d: ", ++ca);
rep(i, 1, 9) scanf("%d", a + i);
bool fl = true;
rep(i, 1, 9) if (a[i] < f[i]){
fl = false;
break;
} if (fl){
printf("%d\n", et);
continue;
} ans = 0;
dfs(1, 0);
printf("%d\n", ans);
} return 0;
}
HDU 5937 Equation(DFS+剪枝)的更多相关文章
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 5937 Equation
题意: 有1~9数字各有a1, a2, -, a9个, 有无穷多的+和=. 问只用这些数字, 最多能组成多少个不同的等式x+y=z, 其中x,y,z∈[1,9]. 等式中只要有一个数字不一样 就是不一 ...
- hdu - 1072(dfs剪枝或bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072 思路:深搜每一个节点,并且进行剪枝,记录每一步上一次的s1,s2:如果之前走过的时间小于这一次, ...
- hdu 5937 -- Equation(搜索)
题目链接 problem description Little Ruins is a studious boy, recently he learned addition operation! He ...
- HDU 1175 连连看 (DFS+剪枝)
<题目链接> 题目大意:在一个棋盘上给定一个起点和终点,判断这两点是否能通过连线连起来,规定这个连线不能穿过其它的棋子,并且连线转弯不能超过2次. 解题分析:就是DFS从起点开始搜索,只不 ...
- hdu 1044(bfs+dfs+剪枝)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1145(Sticks) DFS剪枝
Sticks Problem Description George took sticks of the same length and cut them randomly until all par ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
Sum It Up Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
随机推荐
- 面试:如何把xxx.sh使用/etc/init.d/xxx.sh start启动,并且可以用chkconfig配置开机自启动
chkconfig原理: 1.脚本放到/etc/init.d下面,并且可执行(/etc/init.d/sshd) 需要被chkconfig管理,需要添加进去chkconfig --add sshd ...
- url,href,src区别
URL(Uniform Resource Locator) 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL ...
- Python中变量的作用域
一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...
- 纯虚函数(pure virtual function )和抽象类(abstract base class)
函数体=0的虚函数称为“纯虚函数”.包含纯虚函数的类称为“抽象类” #include <string> class Animal // This Animal is an abstract ...
- ubuntu12.04 ppa安装git
PPA地址:https://launchpad.net/~git-core/+archive/ppa 支持所有的Ubuntu版本. 运行命令: sudo apt-add-repository ppa: ...
- 线程中更新ui方法汇总
一.为何写作此文 你是不是经常看到很多书籍中说:不能在子线程中操作ui,不然会报错.你是不是也遇到了如下的疑惑(见下面的代码): @Override protected void onCreate ...
- day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数
回顾下上次的内容 转码过程: 先decode 为 Unicode(万国码 ) 然后encode 成需要的格式 3.0 默认是Unicode 不是UTF-8 所以不需要指定 如果非要转为U ...
- 数据库导入Exel,输入到浏览器
db.php <?php require dirname(__FILE__)."/dbconfig.php";//引入配置文件 class db{ public $conn= ...
- 【java基础 16】抽象类和接口的区别
导读:前两天闲着没事儿,看了本书,然后写了点代码,在接口里面写了默认方法实现,因为书上说这个特性是从java8开始的,我还特地给测了一下java7. 没过几天,就有一个技术分享会,刚好也是讲java8 ...
- 【Luogu】P3745期末考试(三分)
题目链接 我是怎么把“期末考试”在本地写成“假期计划”的 qwq???? 本题把学生和卷子都排个序,按出成绩最晚时间三分. 三分之后可以O(n)的时间统计答案,因为修改卷子出成绩的时间可以贪心计划. ...