状态压缩DP,把切割出的面积做状态压缩,统计出某状态下面积和。

设f(x,y,S)为在状态为S下在矩形x,y是否存在可能划分出S包含的面积。若S0是S的子集,对矩形x,y横切中竖切,对竖切若f(x,k,S0)且f(x,y-k,S^S0)为真,则为真,对横切同样。

然后枚举S的子集即可。可以用记忆化搜索。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;int dp[105][(1<<15)+5];
bool vis[105][(1<<15)+5];
int area[105];
int se[1<<15];int counts(int s){int res=0;while(s){if(s&1) res++;s>>=1;}return res;
}int dfs(int x,int st){if(vis[x][st]) return dp[x][st];int y=se[st]/x;vis[x][st]=true;if(counts(st)==1) return dp[x][st]=1;for(int s0=(st-1)&st;s0;s0=(s0-1)&st){if(se[s0]%x==0&&dfs(min(x,se[s0]/x),s0)&&dfs(min(x,se[s0^st]/x),s0^st))return dp[x][st]=1;if(se[s0]%y==0&&dfs(min(y,se[s0]/y),s0)&&dfs(min(y,se[s0^st]/y),s0^st))return dp[x][st]=1;}return dp[x][st]=0;
}int main(){int n,x,y,sum,icase=0;while(scanf("%d",&n),n){scanf("%d%d",&x,&y);sum=0;for(int i=0;i<n;i++){scanf("%d",&area[i]);sum+=area[i];}for(int i=0;i<(1<<n);i++){se[i]=0;for(int j=0;j<n;j++){if((1<<j)&i) se[i]+=area[j];}}memset(vis,false,sizeof(vis));printf("Case %d: ",++icase);if(sum!=x*y||sum%x!=0||sum%y!=0){puts("No");}else{dfs(min(x,y),(1<<n)-1);if(dp[min(x,y)][(1<<n)-1]) puts("Yes");else puts("No");}}return 0;
}

  

转载于:https://www.cnblogs.com/jie-dcai/p/4546111.html

LA 4794 状态DP+子集枚举相关推荐

  1. 状态压缩:枚举子集(最优组队)(ybtoj)(动态规划)

    解析 很裸的状压dp 但是直接暴力的话状态2n,枚举2n 乘在一起会T诶 怎么办呢? 使用下面这个循环,就可以保证只会枚举当前状态s的子集 for(int i=(s-1)&s;i;i=(i-1 ...

  2. UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举

    题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...

  3. hdu 4529(状态dp)

    郑厂长系列故事--N骑士问题 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) P ...

  4. POJ 2817 状态DP 字符串找最多的重复

    题意: 给出字符串个数 n 给出n串字符串 找出上下两个字符串重复和最多的个数.. eg: 5 abc bcd cde aaa bfcde 0根据 aaa abc bcd cde bfcde答案就是重 ...

  5. hdu 2809 状态DP 三国吕布

    参考于 http://blog.csdn.net/woshi250hua/article/details/7746780 题意:吕布一个人单挑N个英雄,没打一个英雄一定要有一个人死才行,求最后如何打才 ...

  6. HDU 4284 Travel(12年天津 状态DP)

    转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove 题目:给出一些城市,从1出发,旅 ...

  7. C++算法初级3——子集枚举

    文章目录 子集枚举 1. 引入 2. 子集的表示方式 a. 数组表示法 b. 子集的表示方式 -- 01比特串法 c. 递归枚举子集 3. 代码实现 子集枚举 1. 引入 子集枚举,顾名思义就是在枚举 ...

  8. UVA 11825 状态压缩DP+子集思想

    很明显的状态压缩思想了.把全集分组,枚举每个集合的子集,看一个子集是否能覆盖所有的点,若能,则f[s]=max(f[s],f[s^s0]+1).即与差集+1比较. 这种枚举集合的思想还是第一次遇到,果 ...

  9. UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  10. UVA 11825 Hackers' Crackdown 状态DP

    题意: 有一个由编号0~n-1的n台计算机组成的网络,一共有n种服务,每台计算机上都运行着全部服务,对于每台计算机,你可以选择停止一项服务,这个行为会导致与这台计算机和与他相连的其他计算机上的这项服务 ...

最新文章

  1. can是什么时候处于显性_can总线怎么传输数据格式过程分析
  2. 缓冲流的效率测试_复制文件
  3. 入门第十一课 Python语句的嵌套
  4. lucene使用3.0.3_Apache Lucene 5.0.0即将发布!
  5. Redis 实用技术——事务
  6. 训练日志 2019.2.16
  7. 修改php前台地址,PHPCMS如何增加电话、地址等方便前台调用的自定义变量
  8. 和菜鸟一起学linux总线驱动之初识spi驱动数据传输流程【转】
  9. cpu多开测试软件,游戏多开CPU优化工具
  10. wlan和wifi的区别
  11. 基因编辑最新研究进展(2021年8月)
  12. HTML的简单页面加密代码
  13. Oracle 12cR1 RAC 在VMware Workstation上安装(上)—OS环境配置
  14. VS没有CUDA模块问题
  15. 树莓派开机黑屏问题解决
  16. jni in linux
  17. java oo_我爱oo,我爱java
  18. 用java画只乌龟_Swing编程方面步骤之四java绘图技术画小乌龟
  19. vcd文件中存储多维数组 vcs_IC设计——EDA软件篇——VCS使用
  20. 光E电怎样让理财收益最大化

热门文章

  1. Bettertouchtool for Mac(鼠标增强软件)
  2. iCollections for Mac(桌面整理工具)
  3. ffmpeg CLI常用命令
  4. linux学习之使用fdisk命令进行磁盘分区(八)
  5. 【翻译】CodeMix使用教程(七):扩展
  6. Java的GUI窗体出现乱码解决方法
  7. centos7安装图形界面
  8. 从虚拟化到软件定义--重新定义IT产业格局
  9. jQuery实现输入框聚焦,键盘上下键选择城市
  10. 20151026作业