作业帮 > 综合 > 作业

求 free Pascal

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/15 09:08:03
求 free Pascal
就是一个背包,可以放入的重量为s.现有n件物品,重量分别为w1,w2,w3...wn,从n件中挑选若干件,使得放入背包的重量之和正好为s,找出一组解即可,无解时输出No result.
输入样例
5 10
1 2 3 4 5
输出样例
1 1
4 4
5 5
新手啊,被卡了好久了,谁能帮帮忙,结果没人回答.)
const n=5;
var w:array[1..n] of integer;
    v:array[1..n] of integer;
    k:integer;
    function max(m,n:integer):integer;
      begin
        if m>n then
          max:=m
        else
          max:=n;
      end;
    function maxval(i,aw:integer):integer;
      begin
        if i=1 then
          if w[i]<=aw then
             maxval:=v[i]
          else
            maxval:=0
        else
          maxval:=max(maxval(i-1,aw),maxval(i-1,aw-w[i])+v[i]);
      end;
    begin
      for k:=1 to n do
        read(w[k]);
      readln;
      for k:=1 to n do
        read(v[k]);
      write(maxval(n,15));
    end.
以上程序是递归的写法.还可以去研究动态规划的写法.

上面回答是背包问题求最优值的常用写法.至于你的问题不涉及到求最优值,只是关注是否存在满足重量的组合问题,代码如下. var  w : array[1..10]  of  integer  ;
         x,y ,i:integer ;  f : boolean ;
Function   beibao( s, n : integer ) : boolean ;
    var    k : integer ;
    begin    if s=0 then     beibao:=true    else if (s<0) or (S>0) and  (n<1) then beibao:=false
     else  begin
    if   beibao(s-w[n],n-1) then  begin
              writeln( n:5, w[n]:5) ;
                   beibao:=true;
           end
            else beibao:=beibao(s,n-1)
            end;
  end;
    begin      readln(y) ;      readln( x) ;
      for  I:=1  to   y  do  read(w[I]);
      f:=beibao(x,y);
      if   not(f)   then   writeln( 'not  find') ;
   end.以上两段代码是对背包问题常见的问题解决.程序经过本人测试,绝对能运行而且结果正确.经常看到网上回答的网友写程序完全主观想象随意去写,不调试其正确性,本意是帮助别人是好的,可是缺乏严谨,往往让问问题的朋友耽误很多时间.有的写得太随意,更是让问问题的朋友不知所云.还有到处从别处复制代码粘贴过来,更是缺少诚恳助人之心.希望回答问题的朋友,尽量更加严谨一点,让百度知道真正成为一个让中国人更加方便学习的地方,让中国人多掌握科学知识,从而提升综合国力.