【01背包】拔河比赛

题目:拔河比赛 rqnoj72

题目描述

superwyh的学校要举行拔河比赛,为了在赛前锻炼大家,老师决定把班里所有人分为两拨,进行拔河因为为锻炼所以为了避免其中一方的实力过强老师决定以体重来划分队伍,尽

量保持两个队伍的体重差最少,因为老师对结果没兴趣,所以只告诉老师最小的体重差是多少就行了。这个受苦受累的任务就交给superwyh了,因为这两天superwyh的后背间谍sjh

闹肚子了,所以只好superwyh亲自去调查每个人的体重,但是仅仅知道体重依然难以确定到底如何分配队伍,请各位oier帮助superwyh出出主意。

输入格式

第一行为人数(1<=n<=100),从第二行开始是每个人的体重(0<=m<=100)。

输出格式

最小体重差。

样例输入

4 10 23 41 12

样例输出

4

解释一下样例,第一队是(10+23+12=45),第二队是(41),所以体重差是4,这已经是最有方案

这一题咋一看想到搜索,不过是动规专题,还是用动规吧,看看RQ上说的

当然也少不了万能方法——搜索

Pascal Code

program rqnoj72;

var
  n,sum,ss:longint;
  a:array[0..100+10] of longint;
  f:array[0..100*100+10] of boolean;

procedure init;
begin
  assign(input,'rqnoj72.in');
  assign(output,'rqnoj72.out');
  reset(input);
  rewrite(output);
end;
procedure outit;
begin
  close(input);
  close(output);
  halt;
end;

procedure readdata;
var
  i:longint;
begin
  read(n);
  for i:=1 to n do
  begin
    read(a[i]);
    inc(sum,a[i]);
  end;
  ss:=sum;
  sum:=sum div 2;
end;

procedure main;
var
  i,j:longint;
begin
  f[0]:=true;
  for i:=1 to n do
    for j:=sum downto a[i] do
    begin
      if f[j-a[i]] then f[j]:=f[j-a[i]];
    end;
  for j:=sum downto 0 do
    if f[j] then
    begin
      writeln(ss-j*2);
      outit;
    end;
end;

begin
  init;
  readdata;
  main;
  outit;
end.

 

 

转载于:https://www.cnblogs.com/oijzh/archive/2012/08/19/2646080.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值