.
0/1背包问题: 给定容量V的背包,现在有多个物品要放入背包,每个物品有一定的体积和价值,要求在背包可以放下的情 况下放入的物品的总价值最大(下面给的装箱问题其实也一样的,求总空间最小,其实可以理解为求装入的物品的体积最大化,那么把物品的价值赋值为体积,求体积最大也就是求价值最大!)!
(部分背包问题):贪心
对于部分背包问题,因为物品可以放一部分,而不是必须整体放入。所以可以直接用贪心算法是可以直接解出来的。什么是贪心算法?通俗地讲就是选择的每一步都是最优的。
(全部背包问题):动态规划
对于全部背包问题举例: 算法训练 装箱问题点击打开链接
算法训练 装箱问题
时间限制:1.0s 内存限制:256.0MB
问题描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
输出格式
一个整数,表示箱子剩余空间。
样例输入
24
6
8
3
12
7
9
7
样例输入
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次方(即每个物品都是选或者不选的区别)