背包问题-python3实现

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:szd
@file:背包问题-能装下的最大的价值.py
@time:2022/9/13
https://zhuanlan.zhihu.com/p/93857890  动态规划之背包问题系列
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import math

# 01背包问题 物品放入后就不能再次放入了,即所有的物品只有一件
# #一共5件物品
# N=5
# # 该5件物品的重量分别为:
# w=[12,2,1,1,4]
# # 该5件物品的价值分别为:
# v=[4,2,2,1,10]
# # 背包能够承受的最大重量为:
# W=15
# dp=[0]*(W+1)
# for i in range(N):
#     for j in range(W,w[i]-1,-1):
#         dp[j]=max(dp[j],dp[j-w[i]]+v[i])
# print(dp)#[0, 2, 3, 4, 10, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15]

# 01背包问题,如何确定装的是哪些物品
# from collections import defaultdict
# #一共5件物品
# N=5
# # 该5件物品的重量分别为:
# w=[12,2,1,1,4]
# # 该5件物品的价值分别为:
# v=[4,2,2,1,10]
# # 背包能够承受的最大重量为:
# W=15
# package=defaultdict(list)
# dp=[0]*(W+1)
# for i in range(N):
#     for j in range(W,w[i]-1,-1):
#         if dp[j]<=dp[j-w[i]]+v[i]:
#             dp[j] = dp[j - w[i]] + v[i]
#             package[j]=[]
#             package[j].extend(package[j-w[i]])
#             package[j].append(i)
# print(dp)#[0, 2, 3, 4, 10, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15]
# print(sorted(package.items()))#[(0, []), (1, [2]), (2, [2, 3]), (3, [1, 2]), (4, [4]), (5, [2, 4]), (6, [2, 3, 4]), (7, [1, 2, 4]), (8, [1, 2, 3, 4]), (9, [1, 2, 3, 4]), (10, [1, 2, 3, 4]), (11, [1, 2, 3, 4]), (12, [1, 2, 3, 4]), (13, [1, 2, 3, 4]), (14, [1, 2, 3, 4]), (15, [1, 2, 3, 4])]
# print(list(zip(sorted(package.items()),dp)))#得到的分别是重量,构成的物品,最高的价值

#完全背包问题  物品有无限多个,放入后还可以再次放入
# #一共5件物品
# N=5
# # 该5件物品的重量分别为:
# w=[12,2,1,1,4]
# # 该5件物品的价值分别为:
# v=[4,2,2,1,10]
# # 背包能够承受的最大重量为:
# W=15
# dp=[0]*(W+1)
# for i in range(N):
#     for j in range(w[i],W+1):
#         dp[j]=max(dp[j],dp[j-w[i]]+v[i])
# print(dp)#[0, 2, 4, 6, 10, 12, 14, 16, 20, 22, 24, 26, 30, 32, 34, 36]

#多重背包问题 跟之前不同的是,这里的物品的数量是有限个,可以是1个,可以是n[i]个,但不是无限多个,这样取最大价值
# #一共5种物品
# N=5
# #各个物品的数量为:
# n=[2,3,2,5,2]
# # 该5件物品的重量分别为:
# w=[12,2,1,1,4]
# # 该5件物品的价值分别为:
# v=[4,2,2,1,10]
# # 背包能够承受的最大重量为:
# W=15
# # 获取最大价值
# dp=[0]*(W+1)
# for i in range(N):
#     for j in range(W,w[i]-1,-1):
#         for k in range(1,min(n[i],math.floor(j/w[i]))+1):#k为可以装入第i件物品的个数
#             dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i])
# print(dp)#[0, 2, 4, 5, 10, 12, 14, 15, 20, 22, 24, 25, 26, 27, 28, 29]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值