UVALive 4794 Sharing Chocolate

原创 2016年08月29日 23:24:44

题目链接:http://acm.hust.edu.cn/vjudge/problem/12055


题意:一块长x宽y的巧克力,每次只能横向或者竖向沿直线切割,问能否将一块巧克力切割成给定的n个面积。


思路:dp[x][s]表示还没有切出来的面积状态为s,剩余矩形的最短边为x时是否可行。

保证一开始就满足s的面积和等于初始矩形,所以切的过程中也是相等的,只需要记录一个边即可。

每次枚举s的子集,判断从两个方向切是否可行。记忆化搜索。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007
const int maxn = 1<<15;
int n,uplim;
int X,Y;
int a[20];
int sum[maxn+10]; //∑s
bool vis[101][maxn+10];
bool dp[101][maxn+10];
int num[maxn+10];

void init()
{
    cin>>X>>Y;
    rep(i,1,n)
        scanf("%d",&a[i]);
    uplim = (1<<n)-1;
    rep(i,0,uplim)
    {
        num[i] = 0;
        sum[i] = 0;
        rep(j,0,n-1)
        if ( i & (1<<j) ) sum[i] += a[j+1],num[i]++;
    }
    Clean(vis,false);
}

bool dfs( int Lx , int state )
{
    if ( vis[Lx][state] ) return dp[Lx][state];
    if ( num[state] == 1 ) return true;
    vis[Lx][state] = true;
    int Ly = sum[state] / Lx;
    bool &ans = dp[Lx][state];
    ans = false;
    for ( int i = (state - 1) & state; i; i = (i - 1) & state )
    {
        if ( sum[i] % Lx == 0 && sum[state^i] % Lx == 0 )
            ans |= dfs( min( Lx , sum[i]/Lx ) , i ) & dfs( min( Lx , sum[state^i]/Lx ) , state^i );
        if ( sum[i] % Ly == 0 && sum[state^i] % Ly == 0 )
            ans |= dfs( min( Ly , sum[i]/Ly ) , i ) & dfs( min( Ly , sum[state^i]/Ly ) , state^i );
        if ( ans ) return true;
    }
    return ans;
}

bool solve()
{
    if ( sum[uplim] != X * Y || sum[uplim] % X ) return false;
    return dfs( min(X,Y) , uplim );
}

int main()
{
    int kase = 0;
    while( cin>>n )
    {
        if ( !n ) break;
        init();
        printf("Case %d: %s\n",++kase,solve()?"Yes":"No");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

UVAlive - 4794—— Sharing Chocolate

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12055 由于n 问题的关键是:dp的状态要如何设计才能既达到目的,...
  • AcIsFun
  • AcIsFun
  • 2016年05月18日 21:35
  • 80

LA - 4794 - Sharing Chocolate(状态压缩dp)

题意:能否把一块面积为x*y的巧克力分成面积分别为a1, a2, a3, ..., an的小块巧克力。 题目链接:https://icpcarchive.ecs.baylor.edu/index.ph...
  • SCNU_Jiechao
  • SCNU_Jiechao
  • 2013年04月16日 21:42
  • 1150

UVALive - 4794 Sharing Chocolate DP

题目大意:给出一块面积为x*y的巧克力,每次操作可以沿着一条直线把一块巧克力切割成两块长宽均为整数的巧克力,问能否经过切割得到n块面积分别为a1,a2,...,an的巧克力 解题思路:用sum数组将...
  • L123012013048
  • L123012013048
  • 2015年02月27日 10:12
  • 441

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

UVAlive 4794 Sharing Chocolate   题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=...
  • hahalidaxin
  • hahalidaxin
  • 2016年03月30日 17:20
  • 82

LA 4794(Sharing Chocolate-记忆化搜索)

一个R*C的矩形,每次操作能通过一条线切割成两个长宽均为整数的矩形 是否能通过切割,得到面积恰为a1,a2,...,ana_1,a_2,...,a_n记忆化搜索1..n的子集 dpr,Sdp_{r...
  • nike0good
  • nike0good
  • 2015年12月08日 11:34
  • 602

LA 4794 Sharing Chocolate

题意:给出一个长宽确定的矩形,每次可以沿一条直线把它分课程两块长宽都为整数的巧克力,问能否通过多次操作得到n块面积分别为a1,a2...an的巧克力。 分析:白书原题,状压DP+记忆化搜索。 #i...
  • u014258433
  • u014258433
  • 2016年04月23日 14:53
  • 388

LA 4794 Sharing Chocolate .

题目地址:http://vjudge.net/problem/UVALive-4794 为什么刘汝佳的思路永远天经地义的对,而我的就是错错错,不,是没有思路 这道题问题难在怎么定义状态: 我靠,那么多...
  • qq_34446253
  • qq_34446253
  • 2016年10月23日 16:15
  • 128

uva 1099 - Sharing Chocolate(记忆化搜索)

题目链接:uva 1099 - Sharing Chocolate 题目大意:给出一个巧克力,以及它的长和宽,要求判断能否将这个巧克力分成n个指定面积大小的小巧克力。 解题思路:记...
  • u011328934
  • u011328934
  • 2014年02月18日 10:07
  • 1276

UVA 1099 - Sharing Chocolate(记忆化搜索+状态压缩)

Chocolate in its many forms is enjoyed by millions of people around the world every day. It is a tru...
  • u011217342
  • u011217342
  • 2014年02月16日 14:13
  • 1925

LA 4794 - Sharing Chocolate (状压dp)

Chocolate in its many forms is enjoyed by millions of people around the world every day. It is a tru...
  • mymilkbottles
  • mymilkbottles
  • 2016年09月08日 22:25
  • 184
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVALive 4794 Sharing Chocolate
举报原因:
原因补充:

(最多只允许输入30个字)