文章标题
2017-07-27 16:02
295 查看
生日蛋糕(DFS)
思路(借鉴大神):1、记录每一层的最小面积,和最小体积
2、剪枝处理:剩余体积不够,剪枝,剩余所需要面积大于此时的最优解,剪枝。
3、高度才用满足条件的最小高度min(达到剩余体积所需要的最小高度,该层数的最小高度)
4、最难解决之处:2*(N-v)/lr+s>=ssum,在该处最小估算面积已经大于了此时最优解的面积,剪枝
#include <iostream> #include<cstdio> using namespace std; #define min(a,b) a>b? b:a const int MaxSize=5555555; int ssum; int mins[21],minv[21]; int N,M; int dfs(int v,int s,int ceng,int lr,int lh) { if(ceng==0) { if(v==N&&ssum>s) { ssum=s; } return 0 ; } if(v+minv[ceng-1]>N) return 0; if(s+mins[ceng-1]>ssum) return 0; if(2*(N-v)/lr+s>=ssum) return 0; for(int i=lr-1;i>=ceng;i--) { if(ceng==M) s=i*i; int h=min((N-v-minv[ceng-1])/(i*i),lh-1); for(int j=h;j>=ceng;j--) { dfs(v+i*i*j,s+2*i*j,ceng-1,i,j); } } } int main() { mins[0]=1; minv[0]=0; for(int i=1;i<21;i++) { mins[i]=mins[i-1]+2*i*i; minv[i]=minv[i-1]+i*i*i; } while(scanf("%d%d",&N,&M)==2) { ssum=MaxSize; dfs(0,0,M,N+1,N+1); if(ssum==MaxSize) printf("0\n"); else printf("%d\n",ssum); } }