背包问题(01背包、完全背包、多重背包、混合背包、分组背包)

这里一共有五种背包类型, (01背包、完全背包、多重背包、混合背包、分组背包),掌握了其中的基本解法,背包就不会再是让你头疼的事啦!

加油鸭!今天也要努力哟!!!

目录

 1.小明的背包1 (01背包)

 2.小明的背包2(完全背包)

 3.小明的背包3(多重背包)

 4.小明的背包4(混合背包)

 5.小明的背包5


1.小明的背包1 (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])

一维

将状态 dp[i][j] 优化到一维 dp[j],为什么可以这样变形呢?

我们发现转移方程式完全和 i变量没有关系嘛,那是不是意味着可以把它优化掉呢。

定义:dp[j] 为 n件物品,背包容量 j下的最优解。

状态转移方程: dp[j] = max(dp[j], dp[j - v[i]] + w[i])

在二维情况下,状态 dp[

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值