装载问题(深度优先搜索)

Description

有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。对于给定的n个集装箱和轮船的载重量C,编程计算装入最多时的集装箱个数。

Input

输入由多组测试数据组成。 
每组测试数据输入的第1行中有2个正整数n和C。正整数n是集装箱个数;正整数C是轮船的载重量。接下来的一行中有n个整数,分别表示n个集装箱的重量,它们之间用空格分隔。

Output

对应每组输入,输出最大载重量

Sample Input

 


5 10 7 2 6 5 4

 

Sample Output

 

10


解题思路:读入数据a[i],用一个min数组储存最小值,从n-11循环,把b[i]赋值为a[i]+b[i+1],如果a[i]那么就把min[i]赋值为a[i]若其他情况则把min[i]赋值为min[i+1]。然后搜索,如果s>ans就把ans赋值为s,如果ans=c就退出过程,如果dep<=ns+min[dep]<=cs+b]dep>ans就递归,如果s+a[dep]依然小于等于c,就继续递归,最后输出ans即可。



程序:

var

  ans,c,n,i,j:longint;

  b,min,a:array[0..100] of longint;


procedure dfs(dep,s:longint);

  begin

    if s>ans then ans:=s;

    if ans=c then exit;

    if (dep<=n) and (s+min[dep]<=c) and (s+b[dep]>ans)

      then begin

             dfs(dep+1,s);

             if s+a[dep]<=c then dfs(dep+1,s+a[dep]);

           end;

end;


begin

  readln(n,c);

  for i:=1 to n do

    read(a[i]);

  b[n]:=a[n];

  min[n]:=a[n];

  for i:=n-1 downto 1 do

    begin

      b[i]:=a[i]+b[i+1];

      if a[i]

        else min[i]:=min[i+1];

    end;

  dfs(1,0);

  writeln(ans);

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值