文章标题
来源:互联网 发布:追风打印软件 编辑:程序博客网 时间: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); }}
阅读全文
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- MVC 使用cshtml的一些基础知识-和相关整理
- 使用AppBarLayout+CollapsingToolbarLayout实现自定义工具栏折叠效果
- MUI框架(2)
- JavaScript对象(2)——创建对象
- SpringMVC整合Hibernate Validator验证方法与js校验
- 文章标题
- FCC-Basic Algorithm Scripting
- Linux内核分析-9/进程的调度时机
- Java设计模式之创建型模式
- Maven总结
- Android实时监听并回应
- master-slave模式
- Ubuntu14.04下安装docker 1.9
- 【Java并发编程】-----synchronized