1999年分区联赛提高组之四 邮票面…
2016-04-08 21:44
218 查看
Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1~MAX之间的每一个邮资值都能得到。 例如,N=3,K=2,如果面值分别为1分、4分,则在1分~6分之间的每一个邮资值都能得到(当然还有8分、9分和12分);如果面值分别为1分、3分,则在1分~7分之间的每一个邮资值都能得到。可以验证当N=3,K=2时,7分就是可以得到的连续的邮资最大值,所以MAX=7,面值分别为1分、3分。InputOutputSample Input
3 2Sample Output
1 3
7
解题思路:用深搜的方法,如果该面值可以选择,就标记,继续往下搜索,直到搜索结束,输出选择的和最大值即可。
程序:
const
maxn=175;
var
f:array [0..maxn] of longint;
a,n1:array [1..maxn] of longint;
n,k,max:longint;
procedure init;
var
i,j:longint;
begin
readln(n,k);
end;
function try(x:longint):longint;
var
i,j:longint;
begin
f[0]:=0;
i:=0;
repeat
inc(i);
f[i]:=maxint;
for j:=1 to x do
if a[j]>i then
break
else
if f[i-a[j]]+1
f[i]:=f[i-a[j]]+1;
until f[i]>n;
exit(i-1);
end;
procedure dfs(dep:longint);
var
i,t:longint;
begin
if dep>k then
begin
t:=try(dep);
if t>max then
begin
max:=t;
n1:=a;
end;
exit;
end;
t:=try(dep-1)+1;
for i:=a[dep-1]+1 to t do
begin
a[dep]:=i;
dfs(dep+1);
end;
end;
procedure work;
var
i:longint;
begin
init;
a[1]:=1;
dfs(2);
for i:=1 to k do
write(n1[i],' ');
writeln;
write(max);
end;
begin
work;
end.
版权属于: Chris原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0ig.html转载时必须以链接形式注明原始出处及本声明。
相关文章推荐
- 1999年分区联赛提高组之一 拦截导…
- 1999年分区联赛普级组之二 回文数
- 1998年分区联赛提高组之二 连…
- 1997年分区联赛普级组之三 二进制…
- 1998年分区联赛普级组之二 阶乘
- 1998年分区联赛普级组之一
- 1997年分区联赛普级组之一 统计
- 2007年分区联赛普级组之四 Hanoi双…
- 2006年分区联赛普级组之一 明明的…
- 2005年分区联赛提高组之一 谁拿了…
- 2005年分区联赛普级组之二 校门外…
- 2005年分区联赛普级组之一 陶陶摘…
- 2004年分区联赛提高组之二 合…
- 2004年分区联赛提高组之一 津津的…
- 2004年分区联赛普级组之一 不…
- 2003年分区联赛普级组之四 麦森数
- 2003年分区联赛普级组之一 乒乓球
- 2002年分区联赛提高组之一 均…
- 2002年分区联赛普级组之四 过河卒
- 2002年分区联赛普组组之一 级…