题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3540

题目意思:

给你一块X*Y的巧克力

问你是否可以分成N块大小分别为AI的小巧克力

解题思路:

我们用F[X][S]表示能否分成将一个小边为X且集合为S

切的时候分两种,横切和竖切

横切则是X不变,竖切则是Y不变,可以切成两个子集,按记忆化搜索

对于那些x*y不等于sum[s]的我们可以直接不计算,因为无法满足,没有计算的必要

下面上代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = 16;
const int maxs = 1<<maxn;
const int maxx = 110; int a[maxn];
int f[maxx][maxs];
bool vis[maxx][maxs];
int sum[maxs];
int x,y,n;
int all; int bitcount(int x)
{
return x==0?0:bitcount(x>>1)+(x&1);
} int dp(int S,int x)
{
if(vis[x][S])
return f[x][S];
vis[x][S]=1;
int &ans = f[x][S];
if(bitcount(S)==1)
return ans=1;
int y = sum[S]/x; //枚举子集S0
for(int S0=(S-1)&S;S0;S0=(S0-1)&S)
{
int S2 = S-S0;
if(sum[S0]%x==0 && dp(S0,min(x,sum[S0]/x)) && dp(S2,min(x,sum[S2]/x)))
return ans = 1;
if(sum[S0]%y==0 && dp(S0,min(y,sum[S0]/y)) && dp(S2,min(y,sum[S2]/y)))
return ans = 1;
} return ans = 0;
} int main()
{
int ca = 1;
while(~scanf("%d",&n) && n)
{
memset(sum,0,sizeof(sum));
scanf("%d%d",&x,&y);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int s=0;s<(1<<n);s++)
{
for(int i=0;i<n;i++)
{
if(s&(1<<i))
sum[s]+=a[i];
}
}
all = (1<<n)-1;
memset(vis,false,sizeof(vis));
int ans;
if(sum[all] != x*y || sum[all]%x!=0)
ans = 0;
else
ans = dp(all,min(x,y)); printf("Case %d: %s\n",ca++,ans?"Yes":"No"); }
return 0;
}

UVA1099----Sharing Chocolate----在集合上的DP的更多相关文章

  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. 集合上的动态规划---最优配对问题(推荐:*****) // uva 10911

    /* 提醒推荐:五星 刘汝佳<算法竞赛入门经典>,集合上的动态规划---最优配对问题 题意:空间里有n个点P0,P1,...,Pn-1,你的任务是把它们配成n/2对(n是偶数),使得每个点 ...

  4. BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...

  5. (板子)缩点 + DAG上的DP(深搜)luogu P3387

    板子传送门 根据题目意思,我们只需要找出一条点权最大的路径就行了,不限制点的个数.那么考虑对于一个环上的点被选择了,一整条环是不是应该都被选择,这一定很优,能选干嘛不选.很关键的是题目还允许我们重复经 ...

  6. ZOJ1232 Adventure of Super Mario spfa上的dp

    很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的 ...

  7. UVA - 10131Is Bigger Smarter?(DAG上的DP)

    题目:UVA - 10131Is Bigger Smarter? (DAG) 题目大意:给出一群大象的体重和IQ.要求挑选最多的大象,组成一个序列.严格的体重递增,IQ递减的序列.输出最多的大象数目和 ...

  8. Oracle 12C -- 在相同的列的集合上创建多个索引

    在12C中,可以在相同的列的集合上创建多个索引,但是多个索引的类型要不同.同一时刻,只有一个是可见的. SQL> create table emp_tab as select * from em ...

  9. 区间和序列上的dp

    区间上的dp状态设计最基本的形式: \(F[i]\)表示以i结尾的最优值或方案数. \(F[i][k]\)表示以i结尾附加信息为k的最优值或方案数. 当然可以有多维附加信息. 转移的话往往是枚举上一个 ...

随机推荐

  1. 使用python三方库xlrd解析excel数据

    excel是平常用的比较多的一种数据格式,而在自动化测试过程中,解析其数据以供脚本使用就是一个重要的工作,幸好已有现存的三方库供使用,而不必重新造轮子. 一.安装xlrd模块 到python官网下载h ...

  2. 从date中获取相应信息

    创建测试用表: CREATE OR REPLACE VIEW v AS SELECT TO_DATE('2015-5-5 13:14:15', 'YYYY-MM-DD HH24:MI:SS') AS ...

  3. Python异常记录

    1.常用异常名 AttributeError 调用不存在的方法引发的异常. EOFError 遇到文件末尾引发的异常. ImportError 导入模块出错引发的异常. IndexError 列表越界 ...

  4. PHP相关图书推荐

    PHP和MySQL Web开发(原书第4版) 作      者 [澳] Luke Welling,[澳] Luke Welling 著:武欣 等 译 出 版 社 机械工业出版社 出版时间 2009-0 ...

  5. 为什么要Cssreset

    1.CssReset是什么?由于html标签在各浏览器的默认样式解析出来的有所不同.例如<ul>标签在IE.firefox.chrome浏览器下默认边距是不一样的.各浏览器的默认样,会给我 ...

  6. xdebug初步

    ;加载xdebug模块. 根据PHP版本来选择是zend_extension还是zend_extension_ts  ts代表线程安全  被坑过1次zend_extension="\web\ ...

  7. WebService调用一对多关联关系时出现 死循环:A cycle is detected in...

    通过WebService调用一对多关联关系时引起的问题:A cycle is detected in the object graph 具体异常信息: org.apache.cxf.intercept ...

  8. HW7.14

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  9. Chef

    Chef是一个渐渐流行的部署大.小集群的自动化管理平台.Chef可以用来管理一个传统的静态集群,也可以和EC2或者其他的云计算提供商一起使用.Chef用cookbook作为最基本的配置单元,可以被泛化 ...

  10. 在IT网站上少花些时间

    我自己关注的IT网站还是蛮多的,经常去的有CSDN,博客园,51CTO,InfoQ,还有微博,微信上关注了IT程序猿,IT技术博客大学习,程序员之家, 开发者头条,还有还有,我还通过邮件订阅了码家周刊 ...