• 01背包问题(动态规划)python实现


            在01背包问题中,在选择是否要把一个物品加到背包中。必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题,使用动态规划来解决。n=5是物品的数量,c=10是书包能承受的重量,w=[2,2,6,5,4]是每一个物品的重量,v=[6,3,5,4,6]是每一个物品的价值,先把递归的定义写出来:

            然后自底向上实现,代码例如以下:

    def bag(n,c,w,v):
    	res=[[-1 for j in range(c+1)] for i in range(n+1)]
    	for j in range(c+1):
    		res[0][j]=0
    	for i in range(1,n+1):
    		for j in range(1,c+1):
    			res[i][j]=res[i-1][j]
    			if j>=w[i-1] and res[i][j]<res[i-1][j-w[i-1]]+v[i-1]:
    				res[i][j]=res[i-1][j-w[i-1]]+v[i-1]
    	return res
    
    def show(n,c,w,res):
    	print('最大价值为:',res[n][c])
    	x=[False for i in range(n)]
    	j=c
    	for i in range(1,n+1):
    		if res[i][j]>res[i-1][j]:
    			x[i-1]=True
    			j-=w[i-1]
    	print('选择的物品为:')
    	for i in range(n):
    		if x[i]:
    			print('第',i,'个,',end='')
    	print('')
    
    if __name__=='__main__':
    	n=5
    	c=10
    	w=[2,2,6,5,4]
    	v=[6,3,5,4,6]
    	res=bag(n,c,w,v)
    	show(n,c,w,res)
    	

    输出结果例如以下:

  • 相关阅读:
    JDBC_PreparedStatement
    JDBC_Statement
    JDBC连接数据库
    Oracle语句
    MySQL用户和权限
    MySQL执行计划
    MySQL创建索引
    MySQL正则表达式
    MySQLshow查询
    MySQL多表连接和分页查询
  • 原文地址:https://www.cnblogs.com/wangyu19900123/p/10547706.html
Copyright © 2020-2023  润新知