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

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

题意:问一个面积为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. Ambient Occlusion

    一般在光照模型中,ambient light的计算方法为:A = l * m,其中l表示表面接收到的来自光源的ambient light的总量,而m表示表面接收到ambient light后,反射和吸 ...

  2. Razor之代码复用

    原文:http://www.cnblogs.com/youring2/archive/2011/07/26/2115493.html 1.布局(Layout)复用 Layout的使用,就像WebFor ...

  3. 【译】使用 Python 编写虚拟机解释器

    [译]如何使用 Python 创建一个虚拟机解释器? 原文地址:Making a simple VM interpreter in Python 更新:根据大家的评论我对代码做了轻微的改动.感谢 ro ...

  4. iOS导航栏-导航栏透明

    设置一张透明图片:nav_bargound.png  //导航栏背景     [self.navigationController.navigationBar setBackgroundImage:[ ...

  5. line-height 与垂直居中!

    在此之前,对于line-height 与垂直居中的问题,经常碰到. 比如,图片与span在同一个box中的时候,竟然会各种偏移.要想达到理想的效果真的是各种难. 有时间,决定认真的啃一啃. 一 lin ...

  6. ios开发之AppDelegate

    创建应用程序之后之后,默认有AppDelegate.h文件与AppDelegate.m文件.   AppDelegate为何物?  AppDelegate为整个应用的一个代理,提供程序启动.退出等类似 ...

  7. Win32应用程序中文支持

    Settings--Editor---Encoding改为Windows 936 main.cpp中#include "locale.h" winmain中增加一行: setloc ...

  8. 2014多校第七场1003 || HDU 4937 Lucky Number

    题目链接 题意 : 给定一个十进制n,让你转化成某个进制的数,让这个数只包含3 4 5 6这些数字,这个进制就成为n的幸运数字,输出有多少幸运数字,例如19,5进制表示是34,所以5是19的一个幸运数 ...

  9. WEB前端介绍

    1.WEB前端是神马 Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征.在互联网的演化进程中,网页制作是Web1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为 ...

  10. 【原创】通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错 ...