{------------------------------------ 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; 小弟是学生对编程知之甚少,不足不对的地方 请大侠们对指教!
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元钱找零钱有多少种方法
我以前写的 和你的 有点 类似
1.先排序
2.取任意一个数x y = 4123-x, 如果y<=0 不在查找.
3.找到比y小的任意数, 调用2, 直到>=y
都是四位 数吗?
如果是
就把tempa中的再分类
1000-2000temp1
2000-3000temp2
3000-4000temp3
在四个数组中分别循环
剩下的自己想吧
在有
如果确定都是四位数
第一步玩全可以把大于4000的都去掉
就这么多了期待答案.........
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;
小弟是学生对编程知之甚少,不足不对的地方 请大侠们对指教!
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,
--------------------------------------------------------------------
这样的结果 放在数组里面用双循环 剔除重复的 就是最终结果。
-----------------------------------------------------------