题目链接 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+剪枝)的更多相关文章

  1. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. HDU 5937 Equation

    题意: 有1~9数字各有a1, a2, -, a9个, 有无穷多的+和=. 问只用这些数字, 最多能组成多少个不同的等式x+y=z, 其中x,y,z∈[1,9]. 等式中只要有一个数字不一样 就是不一 ...

  3. hdu - 1072(dfs剪枝或bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072 思路:深搜每一个节点,并且进行剪枝,记录每一步上一次的s1,s2:如果之前走过的时间小于这一次, ...

  4. hdu 5937 -- Equation(搜索)

    题目链接 problem description Little Ruins is a studious boy, recently he learned addition operation! He ...

  5. HDU 1175 连连看 (DFS+剪枝)

    <题目链接> 题目大意:在一个棋盘上给定一个起点和终点,判断这两点是否能通过连线连起来,规定这个连线不能穿过其它的棋子,并且连线转弯不能超过2次. 解题分析:就是DFS从起点开始搜索,只不 ...

  6. hdu 1044(bfs+dfs+剪枝)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. hdu 1145(Sticks) DFS剪枝

    Sticks Problem Description George took sticks of the same length and cut them randomly until all par ...

  8. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  9. 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 ...

随机推荐

  1. HDU - 5884 Sort (二分答案+贪心)

    有n个数字,你需要把这n个数字合成一个数字,每次只能把k个数字合并成一个,花费为这k个数字的和. 给一个最大花费,问不超过这个最大花费的情况下,k的最小值. Sample Input 1 5 25 1 ...

  2. Linux学习-系统基本设定

    网络设定 (手动设定与 DHCP 自动取得) 网络其实是又可爱又麻烦的玩意儿,如果你是网络管理员,那么你必须要了解局域网络内的 IP, gateway, netmask 等参数,如果还想要连上 Int ...

  3. 浅谈Http长连接和Keep-Alive以及Tcp的Keepalive

    原文:https://blog.csdn.net/weixin_37672169/article/details/80283935 Keep-Alive模式: 我们知道Http协议采用“请求-应答”模 ...

  4. 02_ThreadLocal语法与源码分析

    文章导读: 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程 ...

  5. 记一次WMS的系统改造(3)— 行进中的复盘

    行进中的波折 革新总会面对一些阻力和风险,一种新的观念.一种新的模式要来替代既有的产品,从来都不是一件简单的事,在WMS改造这件事上我们一开始就提出两种概念货物驱动和任务驱动,并找到一个标杆产品Sla ...

  6. Django模板(filter过滤器{{ }}与tag标签{% %}应用)

     模板里面过滤器与标签的应用 templates模板里面的应用参考(主要应用在这里面) <!DOCTYPE html> <html lang="en"> & ...

  7. Get Sauce(状压DP)

    描述 In order to celebrate the 8th anniversary of ZOJ, LCLL goes to a sauce factory to "Get Sauce ...

  8. JAVA接口与抽象类区别

    接口 1.接口可以继承多个接口,extends 接口1,接口2,接口3 2.接口的成员变量默认是public static abstract,必须初始化的: 3.接口只能有抽象方法,继承接口的类必须实 ...

  9. webstorm自带debugger服务器

    打开webstorm->settings->Build,Execution,Deployment->Debugger->把端口Port改成8089或者其他80端口,按确定就可以 ...

  10. hihoCoder #1656 前后缀查询

    题目大意 给定 $n$($n\le 50000$) 个由小写英文字母构成的字符串,每个串的长度不超过 10,每个串有一个权值 $v$ ($1\le v\le 100000$). 回答 $m$($m\l ...