#include <iostream>
#include <algorithm>
using namespace std;
class Knap
{
public:
int c; //最大容量
int n; //物品数量
int w[6]; //重量数组
int p[6]; //价值数组
int cw; //当前重量
int cp; //当前价值
int bestp; //当前最大价值
int r; //当前剩余的最大价值
int x[6]; //解向量
int bestx[6]; //最优解向量
void Backtrack(int i);//回溯函数
friend int Knapsack(int w[],int p[],int c,int n);//友元函数,初始化并计算
};
void Knap::Backtrack(int i)//对第i个物品进行操作
{
if(i>n)//如果到叶子节点
{
if(cp>bestp)//并且当前价值大于已经求得的最优值,就更新最优解,包括bestx[]和bestp
{
for(int j=1;j<=n;j++)
bestx[j]=x[j];
bestp=cp;
}
return;
}
/*如果没有到叶子节点,就要对这个节点进行操作,即搜索它的子树,进入做左子树表示可以选第i个,进入右子树表示不能选第i个*/
if(cw+w[i]<=c)//如果能够进入左子树