01背包问题
背包容量:50
物品数量:3
n 1 2 3
重量 10 30 20
价值 60 120 100
回溯算法如下:
#define NUM 100
int c; //背包容量
int n; //物品数量
int cw; //当前重量
int cv; //当前价值
int bestv; //当前最优价值
struct Object
{
int w; //重量
int v; //价值
double d; //单位重量价值比
}Q[NUM]; //物品数组
bool cmp(Object a, Object b)
{
if(a.d>=b.d)return true;
else return false;
}
for (int i=0; in){bestv = cv;return;} //到达叶子结点,更新最优值
if(cw + Q[i].w<=c) //进入左子树搜索
{
cw += Q[i].w;
cv += Q[i].v;
backtrack(i+1);
cw -= Q[i].w;
cv -= Q[i].v;
}
if(Bound (i+1)>bestv)backtrack(i+1); //进入右子树搜索
}
//限界函数Bound的实现
int Bound(int i)
{
int cleft = c-cw; //背包剩余容量
int b = cv; //上界
while (i