#输入两个数,分别为物品的种类数与背包容量 N,V=map(int,input().split()) #分别输入每种物品的重量、价值和件数 weight=[] value=[] count=[] for i inrange(N): w,v,c=map(int,input().split()) weight.append(w) value.append(v) count.append(c) #初始化dp数组 dp=[[0for _ inrange(V+1)]for _ inrange(N+1)] #动态规划 for i inrange(1,N+1): for j inrange(1,V+1): for k inrange(0,count[i-1]+1): if k*weight[i-1]<=j: dp[i][j]=max(dp[i][j],dp[i-1][j-k*weight[i-1]]+k*value[i-1]) #输出结果 print(dp[N][V])
#输入物品数和背包容量 N,V=map(int,input().split()) #将物品的体积和价值分别存入列表中 weight=[] value=[] for i inrange(N): w,v=map(int,input().split()) weight.append(w) value.append(v) #初始化dp数组 dp=[[0for _ inrange(V+1)] for _ inrange(N+1)] #动态规划 for i inrange(1,N+1): for j inrange(1,V+1): #物品本身的体积大于当前的背包容积,无论如何都不装入 #此时该状态的最大价值与表格上位相同 if weight[i-1]>j: dp[i][j]=dp[i-1][j] #体积小于当前背包的体积,需要做一次比较,取最大值 else: dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i-1]]+value[i-1]) #表格右下角即为要求的最大价值 print(dp[N][V])
小明的背包2
完全背包问题。
解题代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#输入物品数和背包容量 N,V=map(int,input().split()) #将物品的体积和价值分别存入列表中 weight=[] value=[] for i inrange(N): w,v=map(int,input().split()) weight.append(w) value.append(v) #初始化dp数组,这里用一维数组 dp=[0for _ inrange(V+1)] #进行动态规划 for i inrange(1,N+1): for j inrange(weight[i-1],V+1): dp[j]=max(dp[j],dp[j-weight[i-1]]+value[i-1]) #最后一位即结果 print(dp[V])
#输入两个数,分别为物品的种类数与背包容量 N,V=map(int,input().split()) #分别输入每种物品的重量、价值和件数 weight=[] value=[] count=[] for i in range(N): w,v,c=map(int,input().split()) weight.append(w) value.append(v) count.append(c) #初始化dp数组 dp=[[0for _ in range(V+1)]for _ in range(N+1)] #动态规划 for i in range(1,N+1): for j in range(1,V+1): for k in range(0,count[i-1]+1): if k*weight[i-1]<=j: dp[i][j]=max(dp[i][j],dp[i-1][j-k*weight[i-1]]+k*value[i-1]) #输出结果 print(dp[N][V])