您的位置:首页 > 其它

生日蛋糕 POJ - 1190

2017-11-07 15:20 387 查看
点击打开链接

参考博客点击打开链接

还是有些迷。。留坑

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

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: