2018_蓝桥_动态规划_0/1背包总结
2018-03-31 19:43
281 查看
.
0/1背包问题: 给定容量V的背包,现在有多个物品要放入背包,每个物品有一定的体积和价值,要求在背包可以放下的情 况下放入的物品的总价值最大(下面给的装箱问题其实也一样的,求总空间最小,其实可以理解为求装入的物品的体积最大化,那么把物品的价值赋值为体积,求体积最大也就是求价值最大!)!
(部分背包问题):贪心
对于部分背包问题,因为物品可以放一部分,而不是必须整体放入。所以可以直接用贪心算法是可以直接解出来的。什么是贪心算法?通俗地讲就是选择的每一步都是最优的。
(全部背包问题):动态规划
对于全部背包问题举例: 算法训练 装箱问题点击打开链接
算法训练 装箱问题 时间限制:1.0s 内存限制:256.0MB 问题描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。输入格式 第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。输出格式 一个整数,表示箱子剩余空间。
样例输入
24
6
8
3
12
7
9
7样例输出0
//全部背包问题
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<iomanip>
using namespace std;
int Volume[30]; int Need[30];//容量和需求度(价值)数组
int cache[40000][30];//刚好写成20000就出错了
int Package(int capacity,int item) {//capacity容量
if (item==-1) {//边界条件
return 0;//返回0
}
int &ret = cache[capacity][item];//动态规划固定的写法
if (ret!=0) {
return ret;
}
//不放入
ret=Package(capacity, item - 1);
//放入(忘记考虑容量这个条件了)
if (capacity>=Volume[item]) {
ret = max(ret, Package(capacity - Volume[item], item - 1) + Need[item]);
}
return ret;
}
int main() {
int ca,n;//箱子容量和物品数目
cin >> ca>>n;
for (int i = 0; i < n;i++) {
cin >> Volume[i];
Need[i] = Volume[i];
}
cout << ca-Package(ca,n-1) << endl;
return 0;
}.
选法应该是2^n次方(即每个物品都是选或者不选的区别)
0/1背包问题: 给定容量V的背包,现在有多个物品要放入背包,每个物品有一定的体积和价值,要求在背包可以放下的情 况下放入的物品的总价值最大(下面给的装箱问题其实也一样的,求总空间最小,其实可以理解为求装入的物品的体积最大化,那么把物品的价值赋值为体积,求体积最大也就是求价值最大!)!
(部分背包问题):贪心
对于部分背包问题,因为物品可以放一部分,而不是必须整体放入。所以可以直接用贪心算法是可以直接解出来的。什么是贪心算法?通俗地讲就是选择的每一步都是最优的。
(全部背包问题):动态规划
对于全部背包问题举例: 算法训练 装箱问题点击打开链接
算法训练 装箱问题 时间限制:1.0s 内存限制:256.0MB 问题描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。输入格式 第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。输出格式 一个整数,表示箱子剩余空间。
样例输入
24
6
8
3
12
7
9
7样例输出0
//全部背包问题
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<iomanip>
using namespace std;
int Volume[30]; int Need[30];//容量和需求度(价值)数组
int cache[40000][30];//刚好写成20000就出错了
int Package(int capacity,int item) {//capacity容量
if (item==-1) {//边界条件
return 0;//返回0
}
int &ret = cache[capacity][item];//动态规划固定的写法
if (ret!=0) {
return ret;
}
//不放入
ret=Package(capacity, item - 1);
//放入(忘记考虑容量这个条件了)
if (capacity>=Volume[item]) {
ret = max(ret, Package(capacity - Volume[item], item - 1) + Need[item]);
}
return ret;
}
int main() {
int ca,n;//箱子容量和物品数目
cin >> ca>>n;
for (int i = 0; i < n;i++) {
cin >> Volume[i];
Need[i] = Volume[i];
}
cout << ca-Package(ca,n-1) << endl;
return 0;
}.
选法应该是2^n次方(即每个物品都是选或者不选的区别)
相关文章推荐
- 动态规划、贪心、回溯、分支限界法解0-1背包问题总结
- 【动态规划】:背包总结
- 2018_蓝桥_sort()函数_排序函数总结
- 总结-动态规划-01背包、完全背包
- 2018_蓝桥_exit(0)函数_退出函数总结
- 2018_蓝桥_pow()函数_次幂函数总结
- 2018_蓝桥_setprecision()函数_保留小数位数函数总结
- 动态规划 4、基础背包问题总结(多重背包与多重背包的转化)
- 动态规划总结(背包问题的深入理解)
- 动态规划总结(01背包 完全背包 多重背包)
- 2018_蓝桥_next_permutation()函数_全排列函数总结
- 动态规划-背包总结
- 【笔记】【算法学习】【动态规划】背包问题总结(1)
- 动态规划之背包问题-总结和拓展(二)
- 动态规划之背包问题-总结和拓展(二)
- 动态规划 4、基础背包问题总结(从01开始)
- 20155325 2017-2018 1 《信息安全系统设计基础》 第九周学习总结
- 2017-2018-1 20155329 《信息安全系统设计基础》第九周学习总结
- [动态规划]背包问题(找零/子集和/编辑距离)
- 2017-2018-1 20155329 《信息安全系统设计基础》第13周学习总结