TYVJ1114(搭建双塔)

本文通过一个具体实例详细介绍了如何使用动态规划解决水晶塔高度差问题,包括变量定义、状态转移方程推导及完整代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法:DP

program P1114;

var
  n:longint;
  v,sum:array[0..101] of longint;{sum[i]表示前i块水晶的高度之和。}
  f:array[0..101,0..8001] of longint;{用f[i,j]表示在前i块水晶里,高塔与矮塔的高度差为j的最矮的塔的高度,所以目标即f[n,0]。}
    
procedure init;
var
  i:longint;
begin
  read(n);
  sum[0]:=0;
  for i:=1 to n do read(v[i]);
end;

procedure main;
var
  i,j,max,t:longint;
begin
  fillchar(f,sizeof(f),200);{因为要求满足条件的最大值,所以初始化为最小值。}
  {依旧是选择排序将水晶的高度按顺序排好。}	
  for i:=1 to n do
    begin
      for j:=i+1 to n do
        begin
          if v[i]>v[j] then
            begin
              t:=v[i];
              v[i]:=v[j];
              v[j]:=t;
            end;
        end;
    end;
  for i:=1 to n do sum[i]:=sum[i-1]+v[i];
  f[1,v[1]]:=v[1];
  for i:=2 to n do
    begin
      for j:=sum[i] downto 0 do{最大的高塔和矮塔的差是sum[i],最小的差就是0。}
        begin
          max:=f[i-1,j];{表示当前的水晶既不放在高塔上,也不放在矮塔上。}
          if f[i-1,j+v[i]]>max then max:=f[i-1,j+v[i]];{表示放在高塔上,这时差距又加大了,而矮塔的高度没变。}
          if j-v[i]>=0 then{如果放在矮塔上,就先要判断放在矮塔上以后矮塔是否会成为高塔。大于等于0即差距依然存在,不会成为高塔。}
            begin
              if f[i-1,j-v[i]]+v[i]>max then max:=f[i-1,j-v[i]]+v[i]{差距缩小同时矮塔的高度增加了。}
              else if f[i-1,abs(j-v[i])]-abs(j-v[i])+v[i]>max then max:=f[i-1,abs(j-v[i])]-abs(j-v[i])+v[i];{否则,之前的高塔会变成矮塔。}
              f[i,j]:=max;{在这些情况中取一个最大值。}
            end;
        end;
    end;
  if f[n,0]>0 then writeln(f[n,0]) else writeln('Impossible');{输出。}
end;

begin
  assign(input,'P1114.in'); reset(input);
  assign(output,'P1114.out'); rewrite(output);

  init;
  main;

  close(input); close(output);
end.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值