赞
踩
这里一共有五种背包类型, (01背包、完全背包、多重背包、混合背包、分组背包),掌握了其中的基本解法,背包就不会再是让你头疼的事啦!
加油鸭!今天也要努力哟!!!
目录
题目描述
小明有一个容量为 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
输入
5 20 1 6 2 5 3 8 5 15 3 3输出
37
定义:dp[i][j]: 前 i个物品,背包容量 j下的最优解
状态转移方程:
当前背包容量不够 j < v[i],所以没法选第 i个物品,答案只能从前 i-1个物品最优解转移而来:dp[i][j] = dp[i-1][j];
当前背包容量够,就要决策选与不选第 i个物品 :
选:dp[i][j] = dp[i-1][j-v[i]] + w[i]
不选:dp[i][j] = dp[i-1][j]
所以答案从这俩个选择中取最大值也就是 dp[i][j] = max(dp[i - 1][j], dp[i-1][j-v[i]] + w[i])
- maxn=1005
- w=[0 for i in range(maxn)]
- v=[0 for i in range(maxn)]
- dp=[[0 for i in range(maxn)]for j in range(maxn)]
- n,m=map(int,input().split())
- for i in range(1,n+1):
- a,b=map(int,input().split())
- w[i]=a
- v[i]=b
- for i in range(1,n+1):
- for j in range(m+1):
- if j<v[i]:
- dp[i][j]=dp[i-1][j]
- else:
- dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
- print(dp[n][m])
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
将状态 dp[i][j] 优化到一维 dp[j],为什么可以这样变形呢?
我们发现转移方程式完全和 i变量没有关系嘛,那是不是意味着可以把它优化掉呢。
定义:dp[j] 为 n件物品,背包容量 j下的最优解。
状态转移方程: dp[j] = max(dp[j], dp[j - v[i]] + w[i])
在二维情况下,状态 dp[
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。