您的位置:首页 > 其它

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 2
Sample 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转载时必须以链接形式注明原始出处及本声明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: