动态规划 从0到1:完全背包问题,提供模板和思路,简单易懂好上手(同时可在相应网站上做练习)

动态规划可以一般按照下面的步骤进行:

1)、状态定义;

2)、状态转移方程;

3)、初始化;

4)、输出;

5)、思考状态压缩。

完全背包问题

这个问题非常类似于01背包问题,所不同的是每种物品有无限件
1、题目描述:
https://www.acwing.com/problem/content/3/
在这里插入图片描述
在这里插入图片描述
2、题解:
状态定义:
dp[i][j] 若只使用前 i 个物品,当背包容量为 j 时,有 dp[i][j] 种方法可以装满背包。
状态转移方程:
dp[i][j] = max(dp[i-1][j],dp[i][j-v[i-1]]+ w[i-1])

伪代码:

v[m]#体积数组
w[m]#价值数组
#初始化 ,m个物品,背包的总容量为n
dp[m+1][n+1]
dp[0][:] = 0
dp[:][0] = 0
for i in [1...m]:
    for j in [1...n]:
        if i >= v[i-1]
        dp[i][j] = max(dp[i-1][j],dp[i][j-v[i-1]]+ w[i-1])
return dp[m][n]

写成pthon语言为 :

m,n = map(int,input().split())
v = [] #体积数组
w = [] #价值数组

for i in range(m):
    num,x = map(int,input().split())
    v.append(num)
    w.append(x)
# print(m,n,v,w)
dp = [[0] * (n+1) for _ in range(m + 1)] 
for i in range(1,m+1):
    for j in range(1,n + 1):
        if j < v[i-1]:
            dp[i][j] = dp[i-1][j]
        else:
            dp[i][j] = max(dp[i-1][j],dp[i][j-v[i-1]]+ w[i-1])
# print(dp)
print(dp[m][n])

状态压缩:
伪代码:


v[m]#体积数组
w[m]#价值数组
#初始化 ,m个物品,背包的总容量为n
dp[n+1]
dp[:] = 0
for i in [0...m-1]:
    for j in [0...n]:
        dp[j] = max(dp[j],dp[j-v[i-1]]+w[i-1])
return dp[n]

用python语音:

#空间优化
m,n = map(int,input().split())
v = [] #体积数组
w = [] #价值数组

for i in range(m):
    num,x = map(int,input().split())
    v.append(num)
    w.append(x)
# print(m,n,v,w)
dp = [0 for _ in range(n+1 )]
for i in range(m):
    for j in range(n+1):
        if j >= v[i-1]:
            dp[j] = max(dp[j],dp[j-v[i-1]]+ w[i-1])
# print(dp)
print(dp[-1])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值