poj1190

#include<stdio.h>
#include<math.h>
int result=0x7fffffff;//保存最小值
int N,M;
void search(int lev,int m,int curS,int r,int h)//lev剩余的体积 m当前层数 curS 当前总表面积 r半径 h 高度
{ if(!m) //当m==0&&lev==0时,说明方案成立,否则说明到达最高层,直接返回 { if(!lev&&curS<result) result=curS; return ; } if(curS>result)//剪枝 return ;
if(curS+lev*2/r>=result)//剪枝
		return ;
	for(int i=r;i>=m;i--)//每层的h和r最小为m
		if(lev>=i)
			for(int j=h;j>=m;j--)
				if(lev-i*i*j>=0)
					if(m==M)
						search(lev-i*i*j,m-1,i*i+2*i*j,i-1,j-1);
					else
						search(lev-i*i*j,m-1,curS+2*i*j,i-1,j-1);
}
int main()
{
	scanf("%d %d",&N,&M);
	search(N,M,0,sqrt((double)N),N/M);//r小于等于sqrt(N),h小于N/M
	if(result<0x7fffffff)
		printf("%d\n",result);
	else
		printf("0\n");
	return 1;
}
原文地址:https://www.cnblogs.com/ltfbk/p/2583052.html