装箱问题-简化版本动态规划

简介: 装箱问题-简化版本动态规划

题目描述


题目

有一个箱子容量为 V(正整数,0≤V≤20000),同时有n个物品(0 \leq n \leq 30$),每个物品有一个体积(正整数)。

要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。


输入描述


输入第一行,一个整数,表示箱子容量。

第二行,一个整数 n,表示有 nn 个物品。

接下来 n 行,分别表示这 n 个物品的各自体积。


输出描述


输出一行,表示箱子剩余空间。


输入输出样例


示例 1

输入

1. 24
2. 6
3. 8
4. 3
5. 12
6. 7
7. 9
8. 7

输出

0

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M


思路


这道题是背包问题的简化版,即不需要管每个物品的价值。我们只需要从这些货物中选出和最接近箱子容量的组合即可。

我们设dp[j]为箱子容积为时,所有货物中选出所得的物品的最接近v的体积。

设计动态转移方程:我们遍历每一个货物i,让箱子体积j从v减小到i的体积,我们有两种选法,一是不拿这个货物,不做任何操作,dp[i][j]等于之间的值dp[i-1][j];另外一种拿这个货物是找到dp[i-1][j-h[i]]即当前的最优解减去h[i]的最优解,dp[i-1][j-h[i]]+h[i]就是我们当前的最优解

状态转移方程如下:

dp[j]=max(dp[j],dp[j-h[i]]+h[i])

代码


1. v = int(input())
2. n = int(input())
3. h = []
4. dp=[0]*10000
5. for i in range(n):
6.     h.append(int(input()))
7. for i in range(n):
8. for j in range(v,h[i]-1,-1):
9.         dp[j]=max(dp[j],dp[j-h[i]]+h[i])
10. print(v-dp[v])
目录
相关文章
|
存储 人工智能 算法
【算法分析与设计】动态规划(下)(一)
【算法分析与设计】动态规划(下)
|
算法
数据结构与算法1.2 算法的定义 什么是好的算法 复杂度的渐进表示
数据结构与算法1.2 算法的定义 什么是好的算法 复杂度的渐进表示
59 0
|
6月前
|
存储 算法 大数据
Python算法高手的必修课:深入理解分治法、贪心算法、动态规划,让你的代码更智能!
【7月更文挑战第9天】在Python算法学习中,分治法(如归并排序)将大问题分解为小部分递归解决;贪心算法(如货币找零)在每步选择局部最优解尝试达到全局最优;动态规划(如斐波那契数列)通过存储子问题解避免重复计算,解决重叠子问题。掌握这三种方法能提升代码效率,解决复杂问题。
60 1
|
存储 算法
【算法分析与设计】动态规划(下)(三)
【算法分析与设计】动态规划(下)
|
消息中间件 人工智能 算法
【算法分析与设计】动态规划(下)(二)
【算法分析与设计】动态规划(下)
|
机器学习/深度学习 算法
【5分钟paper】基于近似动态规划的学习、规划和反应的集成架构
【5分钟paper】基于近似动态规划的学习、规划和反应的集成架构
163 0
|
算法 搜索推荐
开发工程师-常用算法基本思想 -分类-时间复杂度与空间复杂度概述
开发工程师-常用算法基本思想 -分类-时间复杂度与空间复杂度概述
|
算法 数据可视化 Java
【智能算法】CSO蟑螂算法求解无约束多元函数最值(Java代码实现)
【智能算法】CSO蟑螂算法求解无约束多元函数最值(Java代码实现)
158 0
|
算法
Day24——组合(回溯算法)
Day24——组合(回溯算法)
108 0
Day24——组合(回溯算法)
|
存储 算法 C++
算法基础系列第五章——动态规划之背包问题(1)
算法基础系列第五章——动态规划之背包问题(1)
156 0
算法基础系列第五章——动态规划之背包问题(1)