n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割。

预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的。

而且有x,y等效与y,x,那么这里取max(x,y)。

转移的时候枚举S的非空真子集,横着切或者竖着切。

边间是到达一个合法的x,y,S,其中S中只有一个元素。

复杂度O(x*3^n)

#include<bits/stdc++.h>
using namespace std; const int Mx = ,Mxs = <<;
bool meo[Mx][Mxs];
int sumA[Mxs];
int vis[Mx][Mxs], clk;//避免memset
int a[],n;
int ss[]; bool dfs(int x,int y,int S)
{
if(x<y) swap(x,y);
if(vis[x][S] == clk) return meo[x][S];
vis[x][S] = clk;
if(sumA[S] != x*y) return meo[x][S] = false;//这里其实可以dfs外就判断,之后转移一定保证合法
if(*lower_bound(ss,ss+,S)== S) return meo[x][S] = true;
for(int S0 = S&(S-); S0 ; S0 = (S0-)&S){//忽略不在S中的1
if(sumA[S0]%x == ){
int y0 = sumA[S0]/x;
if(dfs(x,y0,S0) && dfs(x,y-y0,S^S0)) return meo[x][S] = true;
}
if(sumA[S0]%y == ){
int x0 = sumA[S0]/y;
if(dfs(x0,y,S0) && dfs(x-x0,y,S^S0)) return meo[x][S] = true;
}
}
return meo[x][S] = false;
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
for(int i = ; i < ; i++){
ss[i] = <<i;
}
while(scanf("%d",&n),n){
int x,y; scanf("%d%d",&x,&y);
for(int i = ; i < n; i++) scanf("%d",a+i);
int mxs = (<<n);
for(int S = ; S < mxs; S++){
sumA[S] = ;
for(int i = ; i < n; i++){
if(S>>i&) sumA[S] += a[i];
}
}
clk++;
printf("Case %d: %s\n",clk,dfs(x,y,mxs-)?"Yes":"No");
}
return ;
}

UVALive 4794 Sharing Chocolate(状压,枚举子集)的更多相关文章

  1. 【暑假】[深入动态规划]UVAlive 4794 Sharing Chocolate

    UVAlive 4794 Sharing Chocolate 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12055 ...

  2. UVALive 4794 Sharing Chocolate

    Sharing Chocolate Chocolate in its many forms is enjoyed by millions of people around the world ever ...

  3. UVALive 4794 Sharing Chocolate DP

    这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块.原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的 ...

  4. CF1556F Sports Betting (状压枚举子集DP)

    F 对于一张比赛图,经过缩点,会得到dag,且它一定是transitive的,因此我们能直接把比赛图缩成一个有向链.链头作为一个强连通分量,里面的所有点都是胜利的 定义F(win)表示win集合作为赢 ...

  5. [POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)

    题目链接:http://poj.org/problem?id=1681 题意:还是翻格子的题,但是这里有可能出现自由变元,这时候枚举一下就行..(其实这题直接状压枚举就行) /* ━━━━━┒ギリギリ ...

  6. HDU2489【状压枚举】

    题意: 给你n个点的图,然后让你在图里挑m个点,达到sumedge/sumnode最小 思路: 由于数据范围小,状压枚举符合m个点的状态,我是用vactor存了结点位置,也记录了结点的sum值,然后跑 ...

  7. POJ3734【状压枚举】

    题意: 给你两个01矩阵,去掉矩阵B的某些行和某些列,问处理后的矩阵B能否变成矩阵A: 思路: 数据较小,状压枚举B矩阵列的数量=A矩阵列的数量时的状态,然后搞定了列,贪心判断B矩阵的行就好了: #i ...

  8. HDU6321 Dynamic Graph Matching【状压DP 子集枚举】

    HDU6321 Dynamic Graph Matching 题意: 给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\( ...

  9. UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)

    题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴 ...

随机推荐

  1. 项目debug1

    QuestionController代码如下: @RequestMapping(value = "/question/{qid}", method = {RequestMethod ...

  2. 无监督学习:Linear Dimension Reduction(线性降维)

    一 Unsupervised Learning 把Unsupervised Learning分为两大类: 化繁为简:有很多种input,进行抽象化处理,只有input没有output 无中生有:随机给 ...

  3. 3dmax————

    去掉阴影 建模中去掉阴影,有时候阴影会挡住视野 , 显示法线 转到可编辑网格,选择面,选择 ,注意下面那个比例调大点,否则看不清楚

  4. 剑指Offer的学习笔记(C#篇)-- 对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 一 . 题目分析 递归法. 一.空树判断,单独搞出来. 二.非空树. 递归:一 ...

  5. python 之 日志输出格式

    # 定义日志文件的路径LOG_PATH=r'D:\code\SH_fullstack_s1\day15\ATM\log\access.log'BOSS_LOG_PATH=r'D:\code\SH_fu ...

  6. 黑马MyBatisday2 MyBatis Dao层实现 接口代理实现&传统实现 动态SQL和SQL抽取 自定义类型处理 分页插件PageHelper

    package com.itheima.mapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelp ...

  7. Sql Server常用函数及技巧

    使用Sql Server好长时间了,今天特别想总结一下,算是回顾吧! 总结: 其实很多技巧,都是基于SQL Server自带的System Views,System Stored Procedures ...

  8. mirror与repository的关系

    mirror与repository的关系 mirror管理的两个repository的关系,本来是访问repoA, 但是repoB mirrorOf repoA, 就会去repoB上去找. https ...

  9. Prime Count 求大区间素数个数

    http://acm.gdufe.edu.cn/Problem/read/id/1333 https://www.zhihu.com/question/29580448/answer/44874605

  10. SpringMVC02 AbstractController And MultiActionController

    1.AbstractController 若处理器继承自AbstractController类,那么该控制器就具有了一些新功能.因为AbstractControll类还继承自一个父类WebConten ...