1999年分区联赛提高组之四 邮票面…

本文探讨了在给定条件下如何通过设计邮票面值来实现连续邮资的最大值。利用深度优先搜索算法,确定最优的邮票面值组合,以确保在限定数量内能够覆盖尽可能大的连续邮资范围。

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

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分。 

Input

 

Output

 

Sample 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
转载时必须以链接形式注明原始出处及本声明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值