[POJ1416 Shredding Company]

[题目来源]:Japan 2002 Kanazawa

[关键字]:搜索

[题目大意]:将一个数字串拆分为多个数字,使得拆分之后形成的几个整数之和是小于目标值的最大值

[分析]:暴力搜索每一种可能的组合,唯一的剪枝就是判断当前是否已经超过上限。

[代码]:

View Code
 1 var
2 n, m, i, min, ans, t, tot: longint;
3 s: string;
4 a, p: array[0..100] of longint;
5
6 procedure dfs(j,k: longint);
7 var
8 i: longint;
9 s2: string;
10 begin
11 if j > m then
12 begin
13 if (min = ans) and (min <= n) then inc(t);
14 if (min > ans) and (min <= n) then
15 begin
16 ans := min;
17 p := a;
18 t := 1;
19 tot := k-1;
20 end;
21 exit;
22 end;
23
24 s2 := '';
25 for i := j to m do
26 begin
27 s2 := s2+s[i];
28 val(s2,a[k]);
29 inc(min,a[k]);
30 if min <= n then dfs(i+1,k+1);
31 dec(min,a[k]);
32 a[k] := 0;
33 end;
34 end;
35
36 begin
37 readln(n,m);
38 while not ((n = 0) and (m = 0)) do
39 begin
40 ans := 0;
41 min := 0;
42 t := 0;
43 tot := 0;
44 fillchar(a,sizeof(a),0);
45 str(m,s);
46 m := length(s);
47 //writeln(s,'',m,'',n);
48 dfs(1,1);
49 if t = 0 then write('error');
50 if t = 1 then
51 begin
52 write(ans,'');
53 for i := 1 to tot-1 do write(p[i],'');
54 write(p[tot]);
55 end;
56 if t > 1 then write('rejected');
57 writeln;
58 readln(n,m);
59 end;
60 end.



你可能感兴趣的:(com)