// 回溯法0-1背包.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
////思路差异:
// 解为子集树:<=c,可进入左子集;>maxvule,则可以进入由结点
//
//
////
#include <iostream>
#include <algorithm>
using namespace std;
class Knap {
public:
void Backtrack(int i);
int bound(int i);
int c,//背包总容量
n,//物品总数量
* w,//物品重量数组
* p,//物品价值数组
cw,//当前总重量
cp,//当前总价值
bestp,//当前最优价值
* x;//是否放入
};
//puplic:
void Knap::Backtrack(int i) //标记了类名,函数体中才可以访问类中属性!!
{
if (i > n)
{
bestp = cp;
/* if (cp > bestp)//不需要,上限函数的比较对象不是bestp
{
}*/
return;
}
//能否放下进入左子树:
if (cw + w[i] <= c)
{
cw += w[i];
cp += p[i];
x[i] = 1;
Backtrack(i + 1);
//返回上一结点,需要恢复场景
cw -= w[i];
cp -= p[i];
}
//判断最优解:进入右子树
//最优的可能下的解>bestp:即cp+p[++1]...+(p[j]/w[j])*cleft>bestp;
if (bound(i+1)> bestp)//i不放入,bound(i)是从w[i]开始