您的位置:首页 > 其它

POJ 1190 生日蛋糕

2012-07-19 00:36 309 查看
剪枝……

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
const int INF=100000000;
int n,m,cnt[50],flag,anss,ans;
void dfs(int c,int l,int lastr,int lasth)
{
int r,h,tmp,minr,minh,i;
if(l==0)
{
if(c==0&&anss>ans)
anss=ans;
}
else{
minr=(tmp=sqrt((c-cnt[l-1])*1.0/l))<lastr?tmp:lastr;
for(r=minr;r>=l;r--)
{
minh=(tmp=(c-cnt[l-1])/(r*r))<lasth?tmp:lasth;
for(h=minh;h>=l;h--)
{
for(tmp=i=0;i<l;i++)
tmp+=(r-i)*(r-i)*(h-i);
if(tmp<c)
continue;
if(l==m)
{
if(r*r<anss)
ans=r*r;
else
continue;
}
if(cnt[l-1]+r*r*h<=c)
{
ans+=2*h*r;
if(ans<anss)
dfs(c-r*r*h,l-1,r-1,h-1);
ans-=2*h*r;
}
}
}
}
}
int main()
{
int i,j,x,y;
//  freopen("test.txt", "r", stdin);
cnt[0]=0;
for(i=1;i<20;i++)
cnt[i]=cnt[i-1]+i*i*i;
while(scanf("%d%d",&n,&m)!=EOF)
{
anss=INF;
if(cnt[m]>n)
printf("0\n");
else
{
dfs(n,m,1000,1000);
if(anss==INF)
printf("0\n");
else
printf("%d\n",anss);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: