试题 算法训练 入学考试

试题 算法训练 入学考试(动态规划)


问题描述
  辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
  如果你是辰辰,你能完成这个任务吗?
输入格式
  第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。
输出格式
  包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
样例输入
70 3
71 100
69 1
1 2
样例输出
3
思路:
这道题就是一个01背包题,动态规划 dp[j]表示当前剩余容量为j背包的最优情况。
我们先选第一个物品来求最优解,然后不断的添加物品来看当前为t的最优解就可以得到最大价值了。我们知道当前物品容量大于当前剩余容量是不可以装的所以我们就让剩余容量大于等于当前物品容量。我们有2种取最优解第1种就是本身的值,第二种就是当前容量减去物品容量的最优解加当前物品的价值就是一种取法,然后我们的转移方程就是:max(dp[j-k[i][0]]+k[i][1],dp[j])
程序:

t,n=map(int,input().split())
k=[]
for  i in range(n):
    k.append(list(map(int,input().split())))  #存入输入
dp=[0 for i in range(t+2)]  #初始化
for i  in range(n):  #当前的物品
    for j in range(t,k[i][0]-1,-1):  #当前的剩余容量
        dp[j]=max(dp[j-k[i][0]]+k[i][1],dp[j])  #和之前的最优解相比较在和减去当前容量的最优解加当前的价值相互比较取最优解
print(dp[t])

**禁止转载。仅用于自己学习。对程序错误不负责

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • rqnoj 采药问题 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望...
    harvey_dong阅读 3,260评论 1 0
  • 动态规划题目 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为...
    小熊_宝宝阅读 799评论 0 0
  • 和分治法一样,动态规划(dynamic programming)是通过组合子问题而解决整个问题的解。 分治法是将问...
    Teci阅读 5,785评论 0 70
  • P1048 采药 输入#1: 70 371 10069 11 2 输出#1: 3 这是一道01背包的模板题,原本还...
    Chikcharry阅读 462评论 0 0
  • 问题描述: 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了...
    mztkenan阅读 580评论 0 0

友情链接更多精彩内容