美文网首页
Uva(1099)(sharingchocolatlie)

Uva(1099)(sharingchocolatlie)

作者: kimoyami | 来源:发表于2018-08-09 14:12 被阅读25次

链接:https://vjudge.net/problem/UVA-1099
思路:10年wf的题,还是首先来建立状态。遍历当前集合,如果里面有一个面积的蛋糕是当前长或者宽的因子,那么就可以切,然后把该元素从集合中剔除,进入到下一个状态。我们考虑到最多分15个蛋糕,那么子集有2的15次方-1个,32767个,然后长和宽各为100,一共327670000个状态,很明显要超时超内存。考虑一下,当i确定的时候,就已经明确了集合中还有哪几个元素,此时总面积也是确定的,所以我们可以预处理算出集合中有某些元素时的面积,此时为了压缩状态,我们取长和宽中小的那一个标记状态,另一个可以由面积/该边得出。这样以来复杂度降低了很多,就可以通过了(这种方法确实牛逼啊,膜拜老刘)
代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,x,y,o=0;
int a[16];
int dp[66000][101],nsum[66000];
int vis[66000][101];

int bitcount(int x){//计算是否只剩一个元素
    return x==0?0:bitcount(x/2)+(x&1);
}

int dfs(int i,int j){
    if(vis[i][j])return dp[i][j];
    vis[i][j] = 1;
    int& ans = dp[i][j];
    if(bitcount(i)==1)//如果只剩一个元素,则返回真
return ans = 1;
    int y = nsum[i]/j;//算出另一边
    for(int s=(i-1)&i;s;s=(s-1)&i){//枚举所有子集的方法
        int s1 = i-s;//子集与全集对应的差集
        if(nsum[s]%j==0&&dfs(s,min(j,nsum[s]/j))&&dfs(s1,min(j,nsum[s1]/j)))//为长的因子且切开的两部分都有解,则当前状态有解
            return  ans = 1;
        if(nsum[s]%y==0&&dfs(s,min(y,nsum[s]/y))&&dfs(s1,min(y,nsum[s1]/y)))//为宽的因子且切开的两部分都有解,则当前状态有解
            return ans = 1;
    }
    return ans = 0;
}
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(scanf("%d",&n)&&n){
        scanf("%d%d",&x,&y);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
         }
         for(int i=0;i<(1<<n);i++){
            nsum[i] = 0;
            for(int j=0;j<n;j++){
                if(i&(1<<j))nsum[i]+=a[j];
            }
         }
         memset(vis,0,sizeof(vis));
         int all = (1<<n)-1;
         int ans;
         if(nsum[all]!=x*y||nsum[all]%x!=0)ans = 0;
         else ans = dfs(all,min(x,y));
         printf("Case %d: %s\n",++o,ans?"Yes":"No");
       }
    return 0;
}

相关文章

  • Uva(1099)(sharingchocolatlie)

    链接:https://vjudge.net/problem/UVA-1099思路:10年wf的题,还是首先来建立状...

  • 素数练习题

    UVA 10375 UVA 10791 UVA10375 Choose and divide 题解 先素数打表,然...

  • 有趣的数学题

    UVA12716 UVA11582 UVA12716 GCD XOR 题解 参考这题用到2个结论a ^ b = c...

  • 字典树

    UVA 11488题目链接https://uva.onlinejudge.org/index.php?option...

  • ACM 国内外几个网站 & 题目分类

    国外 西班牙Valladolid大学 Uva:https://uva.onlinejudge.org俄罗斯Ural...

  • 1099端口占用

    打开cmd,输入 netstat -aon|findstr 1099 找到占用1099端口的进程 在输入 task...

  • 报错1099端口被占用的解决办法

    web项目启动,报错1099端口被占用的解决办法 netstat -aon |findstr "1099" tas...

  • 1099

    为什么喜欢鱼!为什么喜欢猫!为什么1099!就是因为你啊! 那时你的课桌上的每本书都在侧面写上1099,说是不怕丢...

  • 1099

    挪威后摇1099 红咖现场简直太好了,仿佛每一个鼓点都震在你的心上。 我对音乐的了解不多,每次这些有趣的演出都是朋...

  • 1099

    说:“世上最愚蠢的行为,就是不停给人讲道理,成年人应该记住: 位置不同,少言为贵。 认知不同,不争不辩, 三观不同...

网友评论

      本文标题:Uva(1099)(sharingchocolatlie)

      本文链接:https://www.haomeiwen.com/subject/icnqbftx.html