小明的背包2-动态规划

简介: 小明的背包2-动态规划

题目描述


之前的一道类似的题目小明的背包1

小明有一个容量为 V 的背包

这天他去商场购物,商场一共有 N 种物品,第 i件物品的体积为 wi,价值为 vi。,每种物品都有无限多个。

小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。


输入描述


输入第 1行包含两个正整数N,V,表示商场物品的数量和小明的背包容量。

第 2∼N+1 行包含 2 个正整数 w,v,表示物品的体积和价值。

1≤N≤10^2,1≤V≤10^3,1≤wi,vi≤10^3。


输出描述


输出一行整数表示小明所能获得的最大价值。


输入输出样例


示例 1

输入

1. 5 20
2. 1 6
3. 2 5
4. 3 8
5. 5 15
6. 3 3

输出

37

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M


思路


定义dp


定义二维数组dp[][],大小为N*C,dp[i][j]表示把前i个物品装入容量为j的背包中获得的最大值。我们把每个dp[i][j]都看成一个背包,背包的容量是j,装1~i这些物品。最后得到的dp[N][C]就是问题的答案。


状态转移方程:


我们在每次输入体积和价值的时候都让背包的容积从小到大更新一遍。如果此时的背包容积j小于当前这种货物的单个体积v,说明此时的体积装不下这种货物,直接让此时的背包继承上一种货物的最大价值即可。

如果背包的容积大于这种货物的单个体积v,我们就可以往里面装这种货物了,但我们要判断一下装这种货物和不装这种货物所得的最终价值哪个更高,取他们的最大值。题目中说了,每种货物的数量都是无限的,所以随着背包容积j的增加,我们还可以接着装这类货物。


代码


1. N,V=map(int,input().split())
2. dp=[[0]*(V+1) for i in range(N+1)]
3. for i in range(1,N+1):
4.     v,w=map(int,input().split())
5. for j in range(1,V+1):
6.         #装不了这种货物
7. if j<v:
8.             dp[i][j]=dp[i-1][j]
9.         #可以装这种货物,判断是否应该装
10. else:
11.             dp[i][j]=max(dp[i-1][j],dp[i-1][j-v]+w)
12. print(dp[N][V])
目录
相关文章
|
4月前
|
算法 程序员
程序员必知:动态规划——背包问题1:01背包
程序员必知:动态规划——背包问题1:01背包
30 0
|
5月前
|
存储 人工智能 算法
背包问题:小红不想做完全背包
背包问题:小红不想做完全背包
39 1
动态规划之01背包问题和完全背包问题
动态规划之01背包问题和完全背包问题
|
10月前
动态规划入门01背包
基本思路: 1.n物品个数,m为背包体积,使用w[i]记录权值,v[i]记录体积,f[i][j]记录选择前i个物体,在不超过j体积下的最优解 最终答案就是f[n][m]; 2.f[i][j]的状态依赖于之前的状态;即f[i[][j]依赖于f[i - 1][j]的状态;也可以理解为所有的状态由f[0][j]推得 f[i][j]的状态不好算出来,但是f[0][j]的状态必定为0,由f[0][j]可以算出f[1][j]的,由f[1][j]又可算出f[2][j]的递推可得出全部。f[1][1] f[2][2] f[3][3]他们每个都减去第i个物品的权值最大值仍不变,最后在加上w[i]即可 即( f[
54 0
|
11月前
01背包-动态规划
01背包-动态规划
44 0
动态规划——01背包问题、完全背包问题
动态规划——01背包问题、完全背包问题
87 0
|
Java C++
多重背包(小明的背包3)
多重背包(小明的背包3)
动态规划:01背包问题
动态规划:01背包问题
89 0
|
算法 JavaScript 前端开发
动态规划-01背包
前言 动态规划和递归是一对CP,递归通过将大问题分解成小问题以求得答案,而动态规划则是通过求解小问题来组成大问题的解。虽然其本质都是先求小问题的解,但是问题的推算不同: