Fork me on GitHub

生日蛋糕

https://www.luogu.org/problem/show?pid=1731
是一道搜索题,重点在于剪枝。
具体写在代码中

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,ans=0x7fffffff;
void dfs(int t,int r,int h,int v,int s)
{
    if(t==m)
    {
        if(v==0) ans=min(ans,s);
        return;
    }
    if(s+(m-t)>=ans) return;//s+最小的面积>=当前答案,一定不可以(这个最小体积是假设的全是1)
    if(v-r*r*h*(m-t)>0) return;//v-最大的体积大于零,那一定不成功
    for(int i=r-1;i>=m-t;i--)
      for(int j=h-1;j>=m-t;j--){
        if(v-i*i*j>=0) dfs(t+1,i,j,v-i*i*j,s+(t+1==1)*i*i+2*i*j);//是>=0啊,我当时写了个>0,傻乎乎地调了半天……
    }

}
int main()
{
    scanf("%d%d",&n,&m);
    dfs(0,sqrt(n)+1,sqrt(n)+1,n,0);
    if(ans!=0x7fffffff)printf("%d",ans);
    else printf("0");
    return 0;
}
posted @ 2017-09-24 17:48  primes  阅读(91)  评论(0编辑  收藏  举报