0
点赞
收藏
分享

微信扫一扫

生日蛋糕 POJ - 1190

还是有些迷。。留坑

前两个剪枝是看在当前情况下能不能构成一个蛋糕

第三个剪枝是看当前情况下能不能形成最优解

 

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 0x3f3f3f3f

int prevv[50],press[50];
int vv,ll,ans;

void init()
{
int i;
for(i=1;i<=20;i++)
{
prevv[i]=prevv[i-1]+i*i*i;
press[i]=press[i-1]+2*i*i;
}
return;
}

void dfs(int r,int h,int l,int s,int v)
{
int i,j,maxx;

if(l==0)
{
if(v==vv)
{
ans=min(ans,s);
}
return;
}

if(vv-v<prevv[l]||ans-s<press[l]) return;
if(l<ll&&2*(vv-v)/r>ans-s) return;

for(i=r;i>=l;i--)
{
if(l==ll)
{
s=i*i;
}
maxx=(vv-prevv[l-1]-v)/(i*i);
for(j=min(maxx,h);j>=l;j--)
{
dfs(i-1,j-1,l-1,s+2*i*j,v+i*i*j);
}
}
return;
}

int main()
{
int i,j;
init();
while(scanf("%d%d",&vv,&ll)!=EOF)
{
ans=N;
dfs((int)sqrt(vv),vv,ll,0,0);
printf("%d\n",ans);
}
return 0;
}

 

 

 


举报

相关推荐

0 条评论