夕拾算法进阶篇:18)装箱问题 (01背包_动态规划DP)
2017-02-10 11:24
417 查看
问题描述
有一个箱子的容量为V(V为正整数,且满足0≤V≤20000),同时有n件物品(体积值为正整数)要求从n件物品中,选取若干装入箱内,使箱子的剩余空间最小。
输入
1行整数,第1个数表示箱子的容量,第2个数表示有n件物品,后面n个数分别表示这n件 物品各自的体积。
输出
1个整数,表示箱子剩余空间。
输入样例
24 6 8 3 12 7 9 7
输出样例
0
这个题应该是01背包的简单应用,但注意这里没有明确给出物品的价值。题目要求使箱子的剩余空间最小,也就是说使是放入物品的总体积最大。物品的体积在此等价于物品的价值。因此其状态转移方程如下:
dp[i][v]=max{dp[i-1][v],dp[i-1][v-w[i]]+w[i]} (1=<i<=n,w[i]<=v<=V)
在代码中,使用一维的形式如下:
题目来源:http://www.codeup.cn/problem.php?cid=100000631&pid=0
有一个箱子的容量为V(V为正整数,且满足0≤V≤20000),同时有n件物品(体积值为正整数)要求从n件物品中,选取若干装入箱内,使箱子的剩余空间最小。
输入
1行整数,第1个数表示箱子的容量,第2个数表示有n件物品,后面n个数分别表示这n件 物品各自的体积。
输出
1个整数,表示箱子剩余空间。
输入样例
24 6 8 3 12 7 9 7
输出样例
0
这个题应该是01背包的简单应用,但注意这里没有明确给出物品的价值。题目要求使箱子的剩余空间最小,也就是说使是放入物品的总体积最大。物品的体积在此等价于物品的价值。因此其状态转移方程如下:
dp[i][v]=max{dp[i-1][v],dp[i-1][v-w[i]]+w[i]} (1=<i<=n,w[i]<=v<=V)
在代码中,使用一维的形式如下:
#include<iostream> #include<algorithm> using namespace std; const int M=20002; int dp[M]; int main(){ int m,n,i,v,w; cin>>m>>n; for(i=0;i<n;i++){ cin>>w; for(v=m;v>=w;v--){ dp[v]=max(dp[v],dp[v-w]+w); } } cout<<m-dp[m]<<endl; }
题目来源:http://www.codeup.cn/problem.php?cid=100000631&pid=0
相关文章推荐
- 夕拾算法进阶篇:19)采药 (01背包_动态规划DP)
- 实际问题的算法抽象——动态规划中的01背包问题
- 夕拾算法进阶篇:17)01背包和完全背包问题 (动态规划DP)
- wikioi-天梯-普及一等-背包dp-1014:装箱问题
- 动态规划:01背包问题的浅谈
- hhu1017 最小差 动态规划dp 01背包
- DP背包问题小结(01背包,完全背包,需恰好装满或不需,一维DP、二维DP)
- 01背包问题——经典DP问题,优化与未优化
- 01背包问题回溯法和动态规划
- 精卫填海-动态规划dp-01背包
- 集合问题 动态规划 01背包
- 十大算法之一动态规划—解背包问题-C#代码
- 算法复习——背包DP问题
- 算法导论学习笔记(十三):动态规划(三):01背包问题
- dp 背包问题01的优化
- 夕拾算法进阶篇:12)出栈序列统计(动态规划DP)
- 夕拾算法进阶篇:15)最长公共子序列(动态规划DP)
- 算法java实现--动态规划--0-1背包问题
- 算法讲解之Dynamic Programing —— 背包DP [资源分配问题]
- 算法模板之01背包问题