设为首页 加入收藏

TOP

http://poj.org/problem?id=1190
2014-11-23 20:00:38 来源: 作者: 【 】 浏览:4
Tags:http://poj.org/problem 1190
/*
此题是对半径和高的枚举搜索,但要进行剪枝 
*/
#include 
#include 
#include 
#include 
using namespace std;
int n,m,minv[21],mins[21],best;
void dfs(int M,int v,int s,int r,int h)
{
	int i,j,hmax;
	if(M==0) {
		if(v==n&&sn||s+mins[M]>=best||2*(n-v)/r+s>=best) return ;
	//进行剪枝当前体积与剩下M层的最小体积大于n
	//侧面积与剩下M层的最小侧面积大于等于best
	/*剩下M层的侧面积为lefts=2*(r[k]*h[k]+...+r[m]*h[m]) , k=(M+1,..,m)
	lefts>2*(n-v)/r; lefts=best-s; 
	 */
	for(i=r-1;i>=M;i--)
	{
		if(M==m) s=i*i;
		hmax=min((n-v)/(i*i),h-1);
		for(j=hmax;j>=M;j--)
		dfs(M-1,v+i*i*j,s+2*i*j,i,j);
	}
}
int main(int argc, char *argv[])
{
	int i,rmax,hmax;
    minv[0]=0; mins[0]=0;
	for(i=1;i<21;i++)
	mins[i]=mins[i-1]+2*i*i,minv[i]=minv[i-1]+i*i*i;
	//数组mins,minv记录在该层的最小面积和体积,在等于i时取得; 
	while(cin>>n>>m)
	{
	rmax=sqrt(1.0*n)+1;
	hmax=n/(m*m)+1;
	best=1000000;
	dfs(m,0,0,rmax,hmax);
	if(best==1000000) best=0;
	cout< 
 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj2503――Babelfish 下一篇计算加减运算

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python爬虫教程(从 (2025-12-26 16:49:14)
·【全269集】B站最详 (2025-12-26 16:49:11)
·Python爬虫详解:原 (2025-12-26 16:49:09)
·Spring Boot Java: (2025-12-26 16:20:19)
·Spring BootでHello (2025-12-26 16:20:15)