2323
5665
1221
6777
1212
7777
9999
0001
1111
此数据中,那些数据加起来的和刚好是4123
用delphi实现程序(上面的数是乱写的,算法行就可以)

解决方案 »

  1.   

    先排序 ,取任意一个数x  y = 4123-x, 在有序数列查找是否存在y这个数
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      tr = record
        count_1: integer;
        count_2: integer;
        count_5: integer;
      end;
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      V: tr;
      list: array of tr;
      s: string;
      i: integer;
      procedure add(v: tr);
      var
        i: integer;
      begin    for i := 0 to high(list) do
          if (v.count_1 = list[i].count_1) and (v.count_2 = list[i].count_2) and (v.count_5 = list[i].count_5) then
            begin
              exit;
            end;    i := length(list);
        setlength(list, i + 1);
        list[i] := v;
      end;  procedure d(sum: integer; v: tr);
      var
        tmpV: tr;
      begin
        if sum < 0 then
          exit;    if sum = 0 then
          begin
            add(v);
            exit;
          end;
        tmpV := v;
        tmpV.count_1 := tmpV.count_1 + 1;
        d(sum - 1, tmpV);    tmpV := v;
        tmpV.count_2 := tmpV.count_2 + 1;
        d(sum - 2, tmpV);    tmpV := v;
        tmpV.count_5 := tmpV.count_5 + 1;
        d(sum - 5, tmpV);
      end;
    begin
      v.count_1 := 0;
      v.count_2 := 0;
      v.count_5 := 0;  d(10, v);  s := '';  for i := 0 to high(list) do
        begin
          if i > 0 then
            s := s + #13#10;
          v := list[i];
          if v.count_1 > 0 then
            s := s + '1角:' + IntToStr(v.count_1) + '个  ';
          if v.count_2 > 0 then
            s := s + '2角:' + IntToStr(v.count_2) + '个  ';
          if v.count_5 > 0 then
            s := s + '5角:' + IntToStr(v.count_5) + '个  ';    end;  Memo1.Text := s;
    end;end.1角:10个  
    1角:8个  2角:1个  
    1角:6个  2角:2个  
    1角:5个  5角:1个  
    1角:4个  2角:3个  
    1角:3个  2角:1个  5角:1个  
    1角:2个  2角:4个  
    1角:1个  2角:2个  5角:1个  
    2角:5个  
    5角:2个计算1元钱找零钱有多少种方法
    我以前写的  和你的 有点 类似
      

  3.   

    楼上提示得对
    1.先排序 
    2.取任意一个数x  y = 4123-x, 如果y<=0 不在查找.
    3.找到比y小的任意数, 调用2, 直到>=y
      

  4.   

    一个典型的 组合算法问题。 研究一下下面这篇文章,应该有帮助!http://www.chinageren.com/Article/program/Delphi/200508/46649.html
      

  5.   

    不过第一步就是把大于4123的数都去掉。存放在数组tempa中
    都是四位 数吗?
    如果是
    就把tempa中的再分类
    1000-2000temp1
    2000-3000temp2
    3000-4000temp3
    在四个数组中分别循环
    剩下的自己想吧
    在有
    如果确定都是四位数 
    第一步玩全可以把大于4000的都去掉
    就这么多了期待答案.........
      

  6.   

    {------------------------------------
      Index 传递所选数组的元素个数;
      SInt  和的值
      Arr   临时数组 初始必须为空整型数组;
      CountArr 被筛选的整型数组  结果输出 在#0001行处理
    --------------------------------------}
    procedure TForm1.fx(Index,SInt: Integer; Arr,CountArr: IntArr);
    var
      I,J,K,P,Sum:Integer;
      S:String;
      ATemp:IntArr;
      tf:boolean;
    begin  {当所选数大于被选数组个数,退出}
      if high(Arr)>high(CountArr) then
        Exit;  for I := 0 to Index do
      begin
        {判断筛选的数据是否重复,如果允许重复 可以屏蔽下面判断}
        tf:=true;
        SetLength(ATemp,HigH(Arr)+1);
        for K:=0 to High(Arr) do
        begin
          for P:=0 to High(Arr) do
            if (Arr[K]=Arr[P]) and (K<>P) then
            begin
              tf:=false;
            end;
        end;
        {}
        if tf then
        begin
          {求和判断,筛选数据}
          Sum:=0;
          S:='';
          for K:=0 to High(Arr) do
          begin
            S:=S+IntToStr(CountArr[Arr[K]])+',';
            Sum:=Sum+CountArr[Arr[K]];
          end;
          if Sum=SInt then
            Memo2.Lines.Add(S); {#0001}  // 对所筛选的数据 进行处理
                                         {将全部结果保存,再对重复结果筛选 这里不再写出}
        end;    {递归降级处理}
        J:=High(Arr)+2;
        SetLength(Arr,J);
        Arr[High(Arr)]:=I;    fx(I,SInt,Arr,CountArr);    {}
        SetLength(Arr,High(Arr));
      end;end;
    小弟是学生对编程知之甚少,不足不对的地方 请大侠们对指教!
      

  7.   

    补充一下
    type
      IntArr = array of Integer;
    -----------------------------------顺便给个测试结果
    procedure TForm1.Button1Click(Sender: TObject);
    var
      aSelArr,tmpArr:IntArr;
      SumC:integer;
    begin
      SetLength(aSelArr,10);
      aSelArr[0]:=1;
      aSelArr[1]:=3;
      aSelArr[2]:=6;
      aSelArr[3]:=4;
      aSelArr[4]:=7;
      aSelArr[5]:=4;
      aSelArr[6]:=8;
      aSelArr[7]:=2;
      aSelArr[8]:=8;
      aSelArr[9]:=9;  SumC:=11;  fx(high(aSelArr),SumC,tmpArr,aSelArr);end;
    -------------------------------------------------------------------
    4,6,1,
    7,3,1,
    7,4,
    7,4,
    7,4,
    7,4,
    4,6,1,
    4,4,3,
    4,4,3,
    4,7,
    4,7,
    4,7,
    4,7,
    4,7,
    8,3,
    8,3,
    2,6,3,
    2,6,3,
    2,4,4,1,
    2,8,1,
    8,3,
    8,3,
    8,2,1,
    9,2,
    9,2,
    9,2,
    9,2,
    9,2,
    9,2,
    9,2,
    9,2,
    --------------------------------------------------------------------
    这样的结果 放在数组里面用双循环 剔除重复的 就是最终结果。
    -----------------------------------------------------------