前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题

3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题

作者头像
HansBug
发布2018-04-11 10:21:12
5870
发布2018-04-11 10:21:12
举报
文章被收录于专栏:HansBug's Lab

3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题

Time Limit: 3 Sec  Memory Limit: 128 MB

Submit: 48  Solved: 46

[Submit][Status][Discuss]

Description

    贝茜像她的诸多姊妹一样,因为从约翰的草地吃了太多美味的草而长出了太多的赘肉.所以约翰将她置于一个及其严格的节食计划之中.她每天不能吃多过H(5≤日≤45000)公斤的干草.贝茜只能吃一整捆干草;当她开始吃一捆干草的之后就再也停不下来了.她有一个完整

的N(1≤N≤500)捆可以给她当作晚餐的干草的清单.她自然想要尽量吃到更多的干草.很自然地,每捆干草只能被吃一次(即使在列表中相同的重量可能出现2次,但是这表示的是两捆干草,其中每捆干草最多只能被吃掉一次).

    给定一个列表表示每捆干草的重量Si(1≤Si≤H),求贝茜不超过节食的限制的前提下可以吃掉多少干草(注意一旦她开始吃一捆干草就会把那一捆干草全部吃完).

Input

    第1行:两个由空格隔开的整数日和N.

    第2到第N+1行:第i+l行是一个单独的整数,表示第i捆干草的重量Si.

Output

    一个单独的整数表示贝茜在限制范围内最多可以吃多少公斤的干草.

Sample Input

56 4 15 19 20 21

Sample Output

56

HINT

    有四捆草,重量分别是15,19,20和21.贝茜在56公斤的限制范围内想要吃多少就可以吃多少.

    贝茜可以吃3捆干草(重量分别为15,20,21).恰好达到她的56公斤的限制.

Source

Gold

题解:很经典的01背包,不明白为啥都能上金组了= =

方法一:最基本的二维数组方式,这里面使用了一个滚动数组,常见于仅需要存储最近几次结果的DP问题

代码语言:javascript
复制
 1 /**************************************************************
 2     Problem: 3407
 3     User: HansBug
 4     Language: Pascal
 5     Result: Accepted
 6     Time:1120 ms
 7     Memory:1396 kb
 8 ****************************************************************/
 9  
10 var
11    i,j,k,l,m,n:longint;
12    a:array[0..1,0..100000] of longint;
13    b:array[0..100000] of longint;
14 function max(x,y:longint):longint;
15          begin
16               if x>y then max:=x else max:=y;
17          end;
18 begin
19      readln(m,n);
20      for i:=1 to n do readln(b[i]);
21      for i:=1 to n do
22          for j:=0 to m do
23              if j<b[i] then a[i mod 2,j]:=a[(i+1) mod 2,j] else a[i mod 2,j]:=max(a[(i+1) mod 2,j],a[(i+1) mod 2,j-b[i]]+b[i]);
24      writeln(a[n mod 2,m]);
25      readln;
26 end. 

方法二:直接按照《背包九讲》上面的算法,用一维数组搞定(其实核心部分的内循环只要将循环方向倒过来就可直接变成完全背包,想想为什么^_^)

代码语言:javascript
复制
 1 /**************************************************************
 2     Problem: 3407
 3     User: HansBug
 4     Language: Pascal
 5     Result: Accepted
 6     Time:488 ms
 7     Memory:656 kb
 8 ****************************************************************/
 9  
10 var
11    i,j,k,l,m,n:longint;
12    a:array[0..100000] of longint;
13    b:array[0..10000] of longint;
14 function max(x,y:longint):longint;
15          begin
16               if x>y then max:=x else max:=y;
17          end;
18 begin
19      readln(m,n);
20      for i:=1 to n do readln(b[i]);
21      for i:=1 to n do
22          for j:=m downto 0 do
23              if j>=b[i] then a[j]:=max(a[j],a[j-b[i]]+b[i]);
24      writeln(a[m]);
25      readln;
26 end.   

综上,事实证明,同样时间复杂的的两种写法速度居然差了一倍QAQ,表示已吓尿

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-04-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题
  • Description
  • Input
  • Output
  • Sample Input
  • Sample Output
  • HINT
  • Source
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档