您的位置:首页 > 其它

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次方(即每个物品都是选或者不选的区别)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: