[POJ1416 Shredding Company]

本文详细介绍了如何解决日本2002年金泽大学提出的一个数字串拆分问题,旨在将一个数字串拆分为多个数字,使拆分后的整数之和为小于目标值的最大值。通过暴力搜索方法实现,优化剪枝策略以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[题目来源]: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.



转载于:https://www.cnblogs.com/procedure2012/archive/2011/11/02/2232545.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值