[题目来源]: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 begin11 if j > m then12 begin13 if (min = ans) and (min <= n) then inc(t);14 if (min > ans) and (min <= n) then15 begin16 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 do26 begin27 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 begin37 readln(n,m);38 while not ((n = 0) and (m = 0)) do39 begin40 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 then51 begin52 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.转载于:https://www.cnblogs.com/procedure2012/archive/2011/11/02/2232545.html
相关资源:垃圾分类数据集及代码