📅  最后修改于: 2023-12-03 14:59:01.979000             🧑  作者: Mango
01背包问题是一种经典的动态规划问题,在给定一定容量的背包和一些物品的重量和价值情况下,如何选择物品放入背包中,使得最终背包中的总价值最大。
01背包问题可以使用动态规划算法来解决。其中,状态转移方程为:
$$dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])$$
其中,$dp[i][j]$表示前$i$个物品,容量为$j$的背包中的最大价值;$w[i]$表示第$i$个物品的重量;$v[i]$表示第$i$个物品的价值。
通过分析状态转移方程,我们可以得到:在求解$dp[i][j]$时,$dp[i-1][j]$表示不选择第$i$个物品,$dp[i-1][j-w[i]]+v[i]$表示选择第$i$个物品。
因此,我们可以记录每个状态的选择情况,从而在最终得到的最大价值的基础上回溯,打印出所有选择方案。
下面是这个思路的代码实现:
def printAllSolutions(w,v,capacity):
n=len(w)
dp=[[0 for _ in range(capacity+1)] for _ in range(n+1)]
choose=[[False for _ in range(capacity+1)] for _ in range(n+1)]
for i in range(1,n+1):
for j in range(1,capacity+1):
if(w[i-1]<=j):
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i-1]]+v[i-1])
if(dp[i-1][j]<dp[i-1][j-w[i-1]]+v[i-1]):
choose[i][j]=True
else:
dp[i][j]=dp[i-1][j]
solutions=[]
def dfs(i,j,path):
if(j==0):
solutions.append(path)
return
if(i==0):
return
if(choose[i][j]):
dfs(i-1,j-w[i-1],path+[i-1])
dfs(i-1,j,path)
dfs(n,capacity,[])
for solution in solutions:
print(solution)
其中,choose数组记录了每个状态的选择情况,dfs函数根据choose数组进行回溯,得到所有选择方案。
01背包问题是一种经典的动态规划问题,也是解题能力考验的时候经常会遇到的问题。我们可以通过添加一些额外的数据结构,记录每个状态的选择情况,以便于打印出所有选择的方案。