文章标题

来源:互联网 发布:追风打印软件 编辑:程序博客网 时间:2024/06/08 03:54

生日蛋糕(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:aconst 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);   }}
原创粉丝点击