procedure TForm1.Button1Click(Sender: TObject);
const m=7;t=15;
var w:array[0..m] of integer;function knap(s:integer;n:integer):boolean;
    begin
      if (s=0) then
      begin
       result:=true;
       exit;
      end;
      if (s<0) or ((s>0) and (n<1)) then
         begin
           result:=false
         end;
      if knap(s-w[n],n-1)=1 then
      begin
        write(w[n]);result:=true;
      end;
      result:=knap(s,n-1)
    end;
begin
    w[0]:=0;w[1]:=1;w[2]:=4;w[3]:=3;w[4]:=4;
    w[5]:=5;w[6]:=2;w[7]:=7;
    if (knap(t,m)) then writeln('ok')
    else writeln('no!')
end;

解决方案 »

  1.   

    我不知道knap,write函数什么意思
      

  2.   

    甚麼出口?是不是把if (knap(t,m)) then writeln('ok')
        else writeln('no!')
    顯示出來?
    writenln在windows方式下沒甚麼用吧
    用showmessage('ok')好了
      

  3.   

    是阿.write是我用pascal些的没改过来
      

  4.   

    knap(s-w[n],n-1)=1 明显不对,左边Boolean型,右边整型。writeln在这里也不行,你要建立控制台程序。
    方法是:File-->New-->Other-->new-->Console Application
      

  5.   

    其实问题是这样的:一个书包能放下重量为s的书,现有重量为w1,w2,...wn的书共n本,若书包能放下n本书中的若干本(没有剩余重量),则称书包有解.用递归和非递归算法求书包是否有解.(2002年高级程序员考试下午题)
    求pascal的解法.谢谢
      

  6.   

    应该是没有=1的我没改好.不好意思.关键问题是为什么递归回不执行result:=true?
      

  7.   


    c语言的程序是这个
    #include<stdio.h>
    #define N 7
    #define S 15
    int w[N+1] = {0,1,4,3,4,5,2,7};
    int knap ( int S, int n)
    { if(S == 0) return 1; if ( s<O || ( s>O && n<1 )) return 0; if (knap(s-w[n],n-1)) { printf( "4d",w[n] );return 1; } return knap(s,n-1);
    }
    main() { if ( knap(S,N) ) printf( "OK!\n" ); else printf( "N0!\n" );
    }