[NOI1999]生日蛋糕 发表于 2018-08-11 | 分类于 OI 字数统计: 269 | 阅读时长 ≈ 1 很综合的一道搜索题 从下往上搜记为1-k 层最小体积,为1-k 层最小面积记为剩余体积,为当前面积对于第层 可行性剪枝 若,则返回 最优化剪枝 若,则返回 若,则返回 对于最后一种剪枝的证明 1234567891011121314151617181920212223242526272829303132#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int INF=1<<30,N=20;int n,m,v[N],s[N],ans=INF;void dfs(int V,int k,int H,int R,int S){ if (k<=0) { if (!V) ans=min(ans,S); return; } if (V<v[k]) return; if (S+s[k]>ans) return; if (S+2*V/R>ans) return; for(int h=min(H-1,(V-v[k-1])/(k*k));h>=k;h--) for(int r=min(R-1,(int)sqrt((V-v[k-1])/h));r>=k;r--) dfs(V-r*r*h,k-1,h,r,S+2*r*h+r*r*(k==m));}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { v[i]=v[i-1]+i*i*i; s[i]=s[i-1]+2*i*i; } dfs(n,m,INF,INF,0); printf("%d\n",ans==INF?0:ans); return 0;}