poj 生日蛋糕 剪枝+dfs

头一次见这么夸张的剪枝操作。

这个点也很难想

2*r*h=S *

r*r*h=V * =>

V*2/r = S

S + sumS >= best => return;

#include <cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int best = 0x7ffffff;
const int maxn = 1e3+10;
int minv[maxn];
int n,m;
void dfs(int now,int sums,int sumv,int r,int h)
{
	if(now == 0)
	{
		if(sumv==n && best>sums) best = sums;
		return;
	}
	if(sumv+minv[now] > n) return;
	if(2*(n-sumv)/r+sums >= best) return;
	for(int i = r-1; i >= now; --i)
	{
		if(now==m) sums = i*i;
		for(int j = h-1; j >= now; --j)
		{
			dfs(now-1,sums+i*j*2,sumv+i*i*j,i,j);
		}
	}
}
int main()
{
	minv[0] = 0;
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= m; ++i) minv[i] = minv[i-1]+i*i*i;
	int maxh = (n-minv[m-1])/(m*m)+1;
	int maxr = sqrt((double)(n-minv[m-1])/m)+1;
	dfs(m,0,0,maxr,maxh);
	if(best==0x7ffffff) best = 0;
	printf("%d\n",best);
	return 0;	
} 

 

全部评论

相关推荐

04-10 11:56
如皋中学 Java
高斯林的信徒:双c9能简历挂的?
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务