博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1190生日蛋糕--DFS
阅读量:6612 次
发布时间:2019-06-24

本文共 993 字,大约阅读时间需要 3 分钟。

题目数据范围10000,因此简单的DFS会超时,所以要格外注意剪枝。

1.半径r,与高h都从n+1,开始搜索。

2.当前的表面积,加上之后层的预估最小表面积,若大于最优解,减掉。

3.当前的体积,加上之后层的预估最小体积,若大于最优解,减掉。

4.DFS中,若体积超出限制n,则减掉。

5.(目前体积-已有体积)/r*2+已有的表面积若大于已经得到过的S则减掉。

#include
int r[10001];int h[10001];int N,M,S;int miv[21];int mis[21];void dfs(int smm,int v,int dep,int h,int r){ if(v>N) return; if(dep==0){ if(v==N&&smm
N||smm+mis[dep-1]>=S||(N-v)/r*2+smm>S) return; for(int i=r-1;i>=dep;i--){ if(dep==M) smm=i*i; int mxh; if((N-v-miv[dep-1])/(i*i)>h-1) mxh=h-1; else mxh=(N-v-miv[dep-1])/(i*i); for(int j=mxh;j>=dep;j--){ dfs(smm+2*i*j,v+i*i*j,dep-1,j,i); } }}void mx(){ for(int i=1;i<=20;i++){ miv[i]=miv[i-1]+i*i*i; mis[i]=mis[i-1]+2*i*i; }}int main(){ scanf("%d %d",&N,&M); S=99999999;    mx(); dfs(0,0,M,N+1,N+1); if(S==99999999) S=0; printf("%d\n",S); return 0;}

 

转载于:https://www.cnblogs.com/lvcoding/p/6594327.html

你可能感兴趣的文章
加密和解密 tar
查看>>
将datatable 保存为 Excel文件(高效率版本)
查看>>
C/C++五大内存分区(转)
查看>>
springmvc_1(hello world)
查看>>
0.随笔——读后感
查看>>
CentOS 6.5下PXE+Kickstart无人值守安装操作系统
查看>>
xtrapivotcontrol 控件用法及相关属性
查看>>
Shell脚本 常用命令总结 二
查看>>
冰球游戏大概的模块
查看>>
JS模拟select下拉菜单
查看>>
线性方程组迭代求解——Jacobi迭代算法(Python实现)
查看>>
vmware workstation14永久激活密钥分享
查看>>
iOS 多线程 之 GCD(大中枢派发)(一)
查看>>
Myeclipse中打开接口实现类的快捷键
查看>>
删除sql dump中的AUTO_INCREMENT
查看>>
使用JdbcTemplate和JdbcDaoSupport
查看>>
C博客作业--指针
查看>>
版本12.2.0.1.0数据库,复制种子数据库快速创建租户数据库PDB
查看>>
mysql for Mac 下创建数据表中文显示为?的解决方法
查看>>
Glibc 和 uClibc
查看>>