在开始背包问题前我们需要理解回溯法的算法思想
一、回溯法简述:
1.采取深度优先的优先搜索策略
2.回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。
二、回溯法的算法框架:
1.递归回溯最优子结构性质
2.迭代回溯贪心选择性质
3.子集树算法框架
4.排列数算法框架
三、回溯法的基本思想:
1.定义问题解空间
2.确定易于搜索的解空间结构
3.深度优先搜索解空间,采取剪枝函数排除无效搜索。
剪枝函数:利用约束函数在扩展结点剪掉不满足约束的字数,限界函数减去得不到最优解的子树。
0-1背包问题:
给定3种物品和一个背包。物品i的重量分别是W={16,15,15},其价值分别为P={45,25,25},背包的容量为C=30。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
问题分析
在选择装入背包的物品时,每种物品只有两种选择选(1)或不选(0),不能将物品装入背包多次,也不存在装入部分的情况。
深度遍历
简单算法实现如下:
传入物品价值cp,物品重量cw,w[]记录i物体的重量,v[]记录i物品的价值
int rpack(int i,int n,int cw,int cp, float *w, float *p) {
int b;//背包现在价值
float cleft = c - cw;//背包剩余容量
b = cp;
while (i <= n && w[i] <= cleft) {
cleft = cleft - w[i];
b += p[i];
i++;
}
//装满背包
if (i <= n)b = b + p[i] / w[i] * cleft;
return b;
}