C++实现基于回溯法的0-1背包问题
#include<iostream>
using namespace std;
class Knap
{
friend int Knapsack(int p[], int w[], int c, int n);
public:
void print()
{
for (int m = 1; m <= n; m++)
{
cout << bestx[m] << " , ";
}
cout << endl;
};
private:
int Bound(int i);
void Backtrack(int i);
int c;//背包容量
int n; //物品数
int *w;//物品重量数组
int *p;//物品价值数组
int cw;//当前重量
int cp;//当前价值
int bestp;//当前最优值
int *bestx;//当前最优解
int *x;//当前解
};
int Knap::Bound(int i)
{
//计算上界
int cleft = c - cw;//剩余容量
int b = cp;
//以物品单位重量价值递减序装入物品
while (i <= n&&w[i] <= cleft)
{
cleft -= w[i];
b += p[i];
i++;
}
//装满背包
if (i <= n)
b += p[i] / w[i] * cleft;
return b;
}
void Knap::Backtrac