[P1731]生日蛋糕

来源:互联网 发布:ov7670 python 编辑:程序博客网 时间:2024/05/02 04:31

原题链接

dfs
注意剪枝
这个剪枝还挺麻烦的

首先是最优性剪枝
如果当前的面积+之后可行的最小面积仍然大于现在的最优解
那么舍去

可行性剪枝
如果当前的体积+之后可行的最大体积仍小于规定体积
舍去

从大到小枚举是为了方便确定范围

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MOD 1000000007#define LL long longusing namespace std;int n,m,ans=99999999;void dfs(int x,int r,int h,int v,int s){    int i,j;    if(x==0)    {        if(v==0) ans=min(ans,s);        return;    }    if(s+x>ans) return;    if(r<=0||h<=0) return;    if(v-r*r*h*x>0) return;    for(i=r;i>=x;i--)        for(j=h;j>=x;j--)            if(v-i*i*j>=0) dfs(x-1,i-1,j-1,v-i*i*j,s+2*i*j+(x==m)*i*i);     }int main(){    scanf("%d%d",&n,&m);    dfs(m,(sqrt)(n)+1,(sqrt)(n)+1,n,0);    printf("%d",ans);    return 0;}