试题 算法训练 入学考试
问题描述
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
如果你是辰辰,你能完成这个任务吗?
输入格式
第一行有两个整数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])
禁止转载。仅用于自己学习。对程序错误不负责。