ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

背包问题之模板题 Python实现

2022-06-14 01:00:55  阅读:182  来源: 互联网

标签:背包 Python max 最大值 选法 range 物品 模板


前言

01背包——万恶之源
我一定要搞好这个背包问题!

一、 01背包

1. 问题描述

01背包问题:给定\(N\)个物品和容量为\(V\)的背包,每个物品有两个属性:价值\(w_i\)和体积\(v_i\),每个物品只能取1次,问在背包中放入哪些物品可以使得总价值最大?

输入例子:

4 5 # 物品数量和背包容量
1 2 # 物品1的体积和价值
2 4
3 4
4 5

输出例子:

8 # 价值最大的结果

2. 解题思路

  1. 状态表示f[i, j](一般背包问题都是二维)
  • 表示所有选法,满足只从前i个物品中选,并且选出来的物品总体积小于等于j,f[i, j]的值为这些选法的价值的最大值
    • 前i个物品:这个价值最大值从前i个物品考虑,并不代表前i个物品都选了
  • 最后答案是\(f[N][V]\)
  1. 状态计算
  • 对于f[i, j],可以将该集合划分为两部分:选法包含i,选法不包含i。两部分的最大值就是f[i, j]

  • 如何计算这两部分

    • 选法不包含i:从1~i-1中选,且总体积不超过j的所有选法的最大值(这些选法一定不会包含i),即f[i-1, j]

    • 选法包含i:包含i的选法的最大值

      如何求?——“曲线救国”

      1. 先不去看第i个物品,即从第1~i-1个物品中选。

        但是由于最后要加上第i个物品,所以在第1到i-1个物品选时,选法不能超过\(j - v[i]\),得出这部分最大值,即\(f[i-1, j - v[i]]\)

      2. 再加上第i个物品的价值,即可得到包含i的选法的最大价值

        即\(f[i-1, j - v[i]] + w[i]\)

  • 注意,当\(j < v_i\)的时候,即选法总体积装不下第i个物品的时候,选法包含i这个情况不存在

标签:背包,Python,max,最大值,选法,range,物品,模板
来源: https://www.cnblogs.com/3-louise-wang/p/16371689.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有