Python3使用动态规划处理背包问题:完全背包(含背包恰好装满的情况)
文章目录
- 题目介绍
- 题解1
- 题解2
- 题解3
完全背包问题是基于01背包的,如果对01背包问题不熟悉,可以参考: Python3使用动态规划处理01背包问题
题目介绍
- 原题链接:NC309 完全背包
- 描述
你有一个背包,最多能容纳的体积是V。
现在有n种物品,每种物品有任意多个,第i种物品的体积为viv_ivi ,价值为wiw_iwi。
(1)求这个背包至多能装多大价值的物品?
(2)若背包恰好装满,求至多能装多大价值的物品? - 数据范围:1≤v,vi,wi≤10001 \le v,v_i,w_i \le 10001≤v,vi,wi≤1000
- 示例1
输入:6,2,[[5,10],[3,1]]
返回值:
[10,2]
- 示例2
输入:8,3,[[3,10],[9,1],[10,1]]
返回值:
[20,0]
说明:无法恰好装满背包 - 示例3
输入:13,6,[[13,189],[17,360],[19,870],[14,184],[6,298],[16,242]]
返回值:
[596,189]
说明:可以装5号物品2个,达到最大价值298*2=596,若要求恰好装满,只能装1个1号物品,价值为189
题解1
问题1和问题2的求解过程基本一致 ,不同的是在动态规划初始化数组时,在求解问题1时其所对应的动态规划数组全部为0,在求解问题2时其所对应的动态规划数组只有第一个元素为0其余的为负无穷。之所以将动态规划数组里的元素设为负无穷,是为了进行阻断。在从前至后推进时如果在填充了当前元素后还有剩余空间,那么之前扫描过的其他元素若不能恰好填满剩余空间,则这个元素将无法被成功填充(表征为:负无穷加上一个常数还是负无穷),即这种情况将会被阻断。
v, n, nums = 1, 1, []
exec('v, n, nums = ' + input())
dp1 = [0 for i in range(v + 1)]
dp2 = [float('-inf') for j in range(v+1)]
dp2[0] = 0
for i in range(1, n+1):for j in range(1, v+1):if j >= nums[i-1][0]:dp1[j] = max(dp1[j], nums[i-1][1] + dp1[j-nums[i-1][0]])dp2[j] = max(dp2[j], nums[i-1][1] + dp2[j-nums[i-1][0]])
print(f'[{dp1[v]},{0 if dp2[v] < 0 else dp2[v]}]')
题解2
v, n, nums = 1, 1, []
exec('v, n, nums = ' + input())
dp = [0 for i in range(v+1)]
dp1 = [0 for j in range(v+1)]
for i in range(1, v+1):_max = float('-inf')max1 = float('-inf')for j in range(n):if i >= nums[j][0]:_max = max(_max, dp[i-nums[j][0]]+nums[j][1])max1 = max(max1, dp1[i-nums[j][0]]+nums[j][1])_max = max(_max, dp[i-1])dp[i] = _maxdp1[i] = max1
res = 0 if dp1[v] < 0 else dp1[v]
print(f'[{dp[v]},{res}]')
题解3
v, n, nums = 1, 1, []
exec('v, n, nums = ' + input())
V = [0 for i in range(n+1)]
W = [0 for j in range(n+1)]
for goods in range(1, n+1):V[goods] = nums[goods-1][0]W[goods] = nums[goods-1][1]
dp1 = [0 for i in range(v+1)]
dp2 = [float('-inf') for j in range(v+1)]
dp2[0] = 0
for goods in range(1, n+1):for capacity in range(V[goods], v+1):dp1[capacity] = max(dp1[capacity], dp1[capacity - V[goods]] + W[goods])dp2[capacity] = max(dp2[capacity], dp2[capacity - V[goods]] + W[goods])if dp2[capacity] < 0:dp2[capacity] = float('-inf')
res = 0 if dp2[v] == float('-inf') else dp2[v]
print(f'[{dp1[v]},{res}]')
Python3使用动态规划处理背包问题:完全背包(含背包恰好装满的情况)相关推荐
- Python3使用动态规划处理01背包问题
文章目录 视频教程讲解 题目介绍 题解1:二维列表 题解2:一维列表(滚动数组) 延伸阅读 视频教程讲解 [Python算法系列]动态规划2-01背包问题&完全背包问题 [Python算法实战 ...
- 动态规划之背包问题(C语言)
动态规划 动态规划(英语:Dynamic programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最优子结构性质的问题 动 ...
- 动态规划之背包问题——01背包
算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...
- 动态规划/背包问题总结/小结——01背包、完全背包
文章目录 前言 动态规划五步法 01背包模型 完全背包 总结 前言 背包问题也属于动态规划问题. 动态规划就是将复杂的大问题转化为一个小问题,然后将小问题转化为更小的容易求解的问题:通过将最小的容易求 ...
- 动态规划_背包问题(01背包 完全背包)
背包问题-多种物品 重量不同 价值不同. 你可以取最多重量不超过W的物品,问最大价值为多少? 01背包 01背包 指的是 有N个物品 每个物品的重量为W[ i ],价值为V[ i ],(每个物品只有一 ...
- 动态规划之背包问题的一些基础简单入门题
前言 参考视频教程洛谷试练场 普及组 动态规划的背包问题 主要有01背包问题.完全背包问题.分组背包问题. 01背包问题一般从右往左推: 完全背包问题一般从左往右推: 分组背包一般用01的方法但需要记 ...
- 动态规划—完全背包问题
原文作者:弗兰克的猫 原文地址:[动态规划]完全背包问题 目录 说明 完全背包 贪心算法 递归法 最优化原理和无后效性 动态规划 自上而下记忆法 自下而上填表法 总结 0|1说明 在上一篇中,我们对0 ...
- 动态规划_01背包问题_Java实现
原文地址:http://blog.csdn.net/ljmingcom304/article/details/50328141 本文出自:[梁敬明的博客] 1.动态规划 什么是动态规划?动态规划就是将 ...
- 完全背包问题+01背包问题+分组背包+多重背包 总结
背包问题都涉及到动态规划,利用dp进行更加优化的计算. 一.01背包 最基本的是01背包问题,题目一般类似:"在一定数目物品内,挑选总重量不超过一定数目的物品,其中每个物品只能选一次,求背包 ...
最新文章
- win7 64位系统连接xp 32位共享打印机办法
- java通用日志记录_JAVA实现通用日志记录方法
- Python核心编程第四章
- php 获取 uri,获取URI地址
- python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17)...
- linux 查看端口号
- 聚类技术---复杂网络社团检测_基于Plato高性能图计算框架的社团发现算法
- Jquery常用方法合集,超实用
- log.py——打印出独立IP,并统计独立IP数
- POJ 3264:Balanced Lineup(RMQ模板题)
- Maltlab代码:四种基本的信道编码格式
- printf左右对齐
- vue项目移动端、PC端适配方案
- Golang 双链表(Doubly Linked List)
- 疯狂游戏-研发一面-校招面经
- macbook蓝牙pan未连接_机械键盘也能这么萌?洛斐DOT小黄鸭键鼠,蓝牙一键切换!...
- 应届生参加工作,什么事情越早知道越好?
- 如何规划2023高企申报?
- Android 最近任务列表中隐藏图标
- python-opencv学习笔记(八):判断是否雾天与图像能见度测算