2016夏季练习——搜索

本文介绍了一种名为“神剪枝”的算法实现细节,通过递归深度搜索来解决特定问题。该算法使用了多种剪枝策略来减少搜索空间,包括基于体积、表面积和高度的约束条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:POJ1190

神剪枝

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
const int INF=(~0U)>>1;
int ans;
int minv[30],mins[30];
void ini()
{
     int i;
     minv[0]=0;
     mins[0]=0;
     for(i=1;i<22;i++)
     {
         minv[i]=minv[i-1]+i*i*i;
         mins[i]=mins[i-1]+2*i*i;
     }
}
int get_v(int r,int h){
	return r*r*h;
}
int get_s(int r,int h){
	return 2*h*r;
}
void dfs(int floor,int v,int s,int posr,int posh){
	//cout<<floor<<" "<<v<<" "<<s<<" "<<posr<<" "<<posh<<endl;
	if(floor==0){
		//cout<<"ans "<<ans<<endl;
		//getchar();
		if(v==0&&ans>s)
			ans=s;
		return ;
	}
	if(v-minv[floor-1]<0) return ;//$1
	if(s>=ans) return ;//$2
	if(2*v/posr+s>=ans) return ;//$3
	for(int r=posr-1;r>=floor;r--){
		int h;
		h=min(posh-1,(v-minv[floor-1])/(r*r));
		for(int j=h;j>=floor;j--){
			if((v-r*r*j)>=0){
				if(floor==m) s=r*r;//yuanpanchushizhi
				s+=2*r*j;
				dfs(floor-1,v-r*r*j,s,r,j);
				s-=2*r*j;
				if(floor==m) s=0;
			}
		}
	}
}
int main(){
	ini();
	scanf("%d%d",&n,&m);
	ans=0x3f3f3f3f;
	dfs(m,n,0,1+n,1+n);
	if(ans==0x3f3f3f3f)
		ans=0;
	cout<<ans<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值