搜索——[HAOI2012]添加号

题目:[HAOI2012]添加号  

描述:

【题目描述】

有一个由数字1,2,…9组成的数字串(长度不超过8),问如何将M(M<=5)个加号"+"插入到这个数字串中,使所形成的算术表达式的值最小。请编一个程序解决这个问题。

注意:

加号不能加在数字串的最前面或最末尾,也不应有两个或两个以上的加号相邻。

M保证小于数字串的长度。

例如:数字串79846,若需要加入两个加号,则最佳方案为79+8+46,算术表达式的值133。

【输入格式】

第一行是一个数字串(数字串中间无空格),第二行是一个正整数M。

【输出格式】

所求得的最小和的精确值。

【样例输入】

79846
2

【样例输出】

133

【提示】

全部数据:数字串长度不超过8,M<=7。

30%的数据M=1。

50%数据M<=2。

【来源】

2012年河南省青少年信息学(计算机)奥林匹克赛竞赛(初中组)

此题太水了,直接深搜一遍过,不带剪枝和优化,数据太小了……另外吐槽一下Pascal的过程太坑了,变量必须要清零,让我调了两分钟……

AC代码:

{

program zht;
var
i,ans,m,c:longint;
a:array[0..100] of longint;
s:array[0..100] of 0..1;
z:ansistring;

function min(a,b:longint):longint;
begin
if a<b then min:=a else min:=b;
end;

procedure work;
var
h,k,l:longint;
begin


l:=0;
h:=0;
for k:=1 to length(z) do
begin
l:=l*10+a[k];
if s[k]=1 then begin h:=h+l; l:=0; end;
end;
h:=h+l;
ans:=min(ans,h);
end;

procedure find;
var
k:longint;
begin
if c=m then begin work; exit; end;
for k:=1 to length(z)-1 do
 begin
 if s[k]=0 then begin s[k]:=1; inc(c); find; dec(c);
                 s[k]:=0; end;
 end;
end;

begin
assign(input,'purasu.in');
assign(output,'purasu.out');
reset(input);
rewrite(output);

readln(z);

for i:=1 to length(z) do
a[i]:=ord(z[i])-48;
readln(m);

c:=0;
ans:=maxlongint;
fillchar(s,sizeof(s),0);

find;

writeln(ans);
close(input);
close(output);
end.
}

<Marvolo原创,严禁转载>
原文地址:https://www.cnblogs.com/zhtjtcz/p/5033657.html