小L的牛栏

题目背景

小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文,

成功报送了叉院(羡慕不?)。勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后,凭着自己积累下的浓厚经济学与计算机学的基础,成功建设了一个现代化奶牛场!

题目描述

奶牛们十分聪明,于是在牛场建围栏时打算和小L斗智斗勇!小L有N种可以建造围栏的木料,长度分别是l1,l2 … lN,每种长度的木料无限。

修建时,他将把所有选中的木料拼接在一起,因此围栏的长度就是他使用的木料长度之和。但是聪明的小L很快发现很多长度都是不能由这些木料长度相加得到的,于是决定在必要的时候把这些木料砍掉一部分以后再使用。

不过由于小L比较节约,他给自己规定:任何一根木料最多只能削短M米。当然,每根木料削去的木料长度不需要都一样。不过由于测量工具太原始,小L只能准确的削去整数米的木料,因此,如果他有两种长度分别是7和11的木料,每根最多只能砍掉1米,那么实际上就有4种可以使用的木料长度,分别是6, 7,10, 11。

因为小L相信自己的奶牛举世无双,于是让他们自己设计围栏。奶牛们不愿意自己和同伴在游戏时受到围栏的限制,于是想刁难一下小L,希望小L的木料无论经过怎样的加工,长度之和都不可能得到他们设计的围栏总长度。不过小L知道,如果围栏的长度太小,小L很快就能发现它是不能修建好的。因此她希望得到你的帮助,找出无法修建的最大围栏长度。

这一定难不倒聪明的你吧!如果你能帮小L解决这个问题,也许他会把最后的资产分给你1/8哦!

输入输出格式

输入格式:
输入的第一行包含两个整数N, M,分别表示木料的种类和每根木料削去的最大值。以下各行每行一个整数li(1< li< 3000),表示第i根木料的原始长度。

输出格式:
输出仅一行,包含一个整数,表示不能修建的最大围栏长度。如果任何长度的围栏都可以修建或者这个最大值不存在,输出-1。

输入输出样例

输入样例#1:
2 1
7 11
输出样例#1:
15
说明

40 % :1< N< 10, 0< M< 300

100 % :1< N< 100, 0< M< 3000

大意:
一个数不可以被木条组成,求这个数的最大值。

分析:这个值要不有,要不没有。如果这个只有的话,一定不会很大,要不就是无限。根据数据,这个数<=50000。如果有一个i长度的木条,如果j-i可以被合成,则j也可以被合成。

代码:

var
 a:array [1..3000] of boolean;
 h:array [1..3000] of longint;
 f:array [0..50000] of boolean;
 n,m,i,j,ans,num,x:longint;
begin
 readln(n,m);
 for i:=1 to n do
 begin
  read(x);
   for j:=0 to m do
     if (x-j>0) and (a[x-j]=false) then
      begin
       inc(num);
       h[num]:=x-j;
       a[x-j]:=true;
      end;
 end;
f[0]:=true;
 for i:=1 to 50000 do
  begin
   for j:=1 to num do
    if (i-h[j]>=0) then
     if f[i-h[j]] then
      begin
       f[i]:=true;
       break;
      end;
   if f[i]=false then ans:=i;
  end;
 if (ans=0) or (ans=50000) then writeln(-1)
                           else writeln(ans);
end.
阅读更多
版权声明:2333 https://blog.csdn.net/liangzihao1/article/details/52597328
个人分类: DP
想对作者说点什么? 我来说一句
相关热词

没有更多推荐了,返回首页

关闭
关闭
关闭