大白书中的题感觉一般都比较难,能理解书上代码就已经很不错了

按照经验,一般数据较小的题目,都有可能是用状态压缩来解决的

题意:问一个面积为x×y的巧克力,能否切若干刀,将其切成n块面积为A1,A2,,,An块巧克力。(每次只能沿直线切一块巧克力)

设计状态:

f(r, c, S) = 1表示r行c列的巧克力可以切成面积集合为S的若干块巧克力

分解问题:

f(r, c, S) = 1当且仅当

  1. 横着切:存在1≤r0<r和S的子集S0,使得f(r0, c, S0) = f(r-r0,c, S-S0) = 1.   或者
  2. 竖着切:存在1≤C0<C和S的子集S0,使得f(r, C0, S0) = f(r,C-C0, S-S0) = 1.

状态的优化:

因为f(r, c, S) = f(c, r, S),所以我们去掉一个参数,并且假设r≤c

记f(r, S)表示min(r, sum[S]/r)行max(r, sum[S]/r)列的巧克力能否切成面积和为sum[S]的若干块

DP函数中那句 int& ans;的作用是什么作用不太懂,我开始时去掉以后WA掉了,Orz

这句留着以后再弄懂吧,=_=||

将ans声明为f[S][x]的引用,这样ans在赋值的时候f[S][x]也相应被改变

 //#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = ;
const int maxw = + ;
int a[maxn], sum[ << maxn], f[ << maxn][maxw], vis[ << maxn][maxw]; int bitcount(int S)
{
return S == ? : (S & ) + bitcount(S >> );
} int dp(int S, int x)
{
if(vis[S][x]) return f[S][x];
vis[S][x] = ;
int& ans = f[S][x];
if(bitcount(S) == )
return ans = ;
int y = sum[S] / x;
for(int S0 = (S-)&S; S0 != ; S0 = (S0-)&S)
{
int S1 = S - S0;
if(sum[S0] % x == && dp(S0, min(x, sum[S0]/x)) && dp(S1, min(x, sum[S1]/x)))
return ans = ;
if(sum[S0] % y == && dp(S0, min(y, sum[S0]/y)) && dp(S1, min(y, sum[S1]/y)))
return ans = ;
}
return ans = ;
} int main(void)
{
#ifdef LOCAL
freopen("4794in.txt", "r", stdin);
#endif int kase = , n;
while(scanf("%d", &n) == && n)
{
int x, y;
scanf("%d%d", &x, &y);
for(int i = ; i < n; ++i)
scanf("%d", &a[i]); memset(sum, , sizeof(sum));
for(int i = ; i < ( << n); ++i)
for(int j = ; j < n; ++j)
if(i & ( << j))
sum[i] += a[j]; memset(vis, , sizeof(vis));
int All = ( << n) - ;
int ans;
if(sum[All] != x*y)
ans = ;
else
ans = dp(All, min(x, y));
printf("Case %d: %s\n", ++kase, ans ? "Yes" : "No");
}
return ;
}

代码君

LA 4794 Sharing Chocolate的更多相关文章

  1. LA 4794 - Sharing Chocolate dp

    题意 有一块\(x*y\)的巧克力,问能否恰好分成n块,每块个数如下 输入格式 n x y a1 a2 a3 ... an 首先\(x \times y 必然要等于 \sum\limits_{i=1} ...

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

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

  3. UVALive 4794 Sharing Chocolate

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

  4. UVa Live 4794 - Sharing Chocolate 枚举子集substa = (s - 1) & substa,记忆化搜索 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  5. UVALive 4794 Sharing Chocolate(状压,枚举子集)

    n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割. 预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的 ...

  6. UVALive 4794 Sharing Chocolate DP

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

  7. LA 4794 状态DP+子集枚举

    状态压缩DP,把切割出的面积做状态压缩,统计出某状态下面积和. 设f(x,y,S)为在状态为S下在矩形x,y是否存在可能划分出S包含的面积.若S0是S的子集,对矩形x,y横切中竖切,对竖切若f(x,k ...

  8. UVa 1009 Sharing Chocolate (数位dp)

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  9. LA4794 Sharing Chocolate

    传送门 记忆化搜索. 在下觉得sxy大佬的代码写得相当好,通篇的骚操作(因为我都不会呀),%%% 学到了 预处理每个状态的值.以前的我都是zz地枚举每一位.. for(int i=1;i<(1& ...

随机推荐

  1. asp.net 创建文字特效

    相信word 中的 艺术字 功能大家都不陌生.今天, 我们就利用C#来制作几款自己的艺术字, 可能会对我们了解字体图像的制作原理有一些帮助. 至于有没有使用价值我保持沉默. 一. 投影效果 程序运行效 ...

  2. 函数式 CSS (FCSS)

    在Wealthfront我们是一个函数式编程的超级粉丝.强调不变性和函数式风格意味着更少的“意外”(surprises),因为副作用是有限的或不存在的.我们能将独立的组件迅速构建出大型系统,通过组合的 ...

  3. ZOJ题目分类

    ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...

  4. The first day of HTML

    这是韩顺平老师的<轻松搞定网页设计(html.css.js)>,讲的还凑合,仅作入门.决定还是做好笔记,记录学习的过程,这是HTML的第一天. HTML(HyperText Mark-up ...

  5. 初始JSON

    SON是一种传输数据的格式(以对象为样板,本质上就是对象,但用途有区别,对象就是本地用的,json是用来传输的 JSON的两种静态方法: 1.JSON.parse();  string --> ...

  6. 【poj3358】消因子+BSGS 或 消因子+欧拉定理 两种方法

    题意:给你一个分数,求它在二进制下的循环节的长度,还有第一个循环节从哪一位开始. For example, x = 1/10 = 0.0001100110011(00110011)w and 0001 ...

  7. 8天学通MongoDB——第一天 基础入门

    原文地址:http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html 关于mongodb的好处,优点之类的这里就不说了,唯 ...

  8. 天使投资、VC 以及 PE 的区别是什么?

    如果满足于“阶段不同”这个简单的回答,那你可能错过了一个思考资本与企业发展之间关系的机会. 首先要交待一下,在大众语境中,angel/VC/PE三者都可认为是VC,也就是人们常说的风险投资,在国内官方 ...

  9. Clearing Floats清除浮动--clearfix的不同方法的使用概述

    清除浮动早已是一个前端开发人员必学的一课.毫无疑问,多年来,我们已经接触过多种清除浮动的方法,现在“clearfix methods”越来越被大家熟知.在深入剖析“clearfix”的多种用法之前,我 ...

  10. mongo中查询Array类型的字段中元素个数

    I have a MongoDB collection with documents in the following format: { "_id" : ObjectId(&qu ...