noi99生日蛋糕

搜索剪枝

program project1;
var n,m,i,min,s:longint;
    r,h:array[0..30]of longint;
    fl:array[0..20]of int64;
procedure dfs(x:longint;v:int64);
var i,j:longint;
begin
 if (x=m+1) then
  begin
   if (min>s+r[1]*r[1])and(v=n) then
    min:=s+r[1]*r[1];
   exit;
  end;
 if s+2*(n-v) div r[x-1]>min then exit;
 if v+r[x-1]*r[x-1]*h[x-1]*(m-x+1)<n then exit;
 if v+fl[m-x]>n then exit;
 for i:=r[x-1]-1 downto m-x+1 do
  for j:=h[x-1]-1 downto m-x+1 do
   begin
    r[x]:=i;
    h[x]:=j;
    s:=s+2*r[x]*h[x];
    dfs(x+1,v+r[x]*r[x]*h[x]);
    s:=s-2*r[x]*h[x];
   end;
end;
begin
 read(n);
 read(m);
 r[0]:=round(sqrt(n))+1;
 h[0]:=n+1;
 for i:=1 to m do
  fl[i]:=i*i*(i+1)*(i+1) div 4;
 s:=0;
 min:=maxlongint;
 dfs(1,0);
 if min=maxlongint then writeln(0) else writeln(min);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值