C++代码
#include <iostream>
#include <vector>
using namespace std;
int n; // 物品数量
int c; // 背包容量
vector<int> w; // 物品重量
vector<int> v; // 物品价值
double cp = 0; // 当前价值
int cw = 0; // 当前重量
double bestp = 0; // 最优价值
vector<int> bestx; // 最优解的物品组合
vector<int> cx; // 当前解的物品组合
// 计算上界函数,用于剪枝
double Bound(int i) {
double leftw = c - cw; // 剩余背包容量
double b = cp; // 当前总价值
// 尽可能多地装入剩余的物品
while (i <= n && w[i] <= leftw) {
leftw -= w[i];
b += v[i];
i++;
}
// 如果还有剩余空间,尝试装入下一个物品的一部分(装满背包)
if (i <= n) {
b += v[i] / (double)w[i] * leftw; // 单位重量价值乘以剩余容量
}
return b; // 返回计算出的上界
}
// 回溯函数
void Backtrack(int i) {
if (i > n) {
if (cp > bestp) {
bestp = cp;
bestx = cx;
}
return;
}
// 进入左子树
if (cw + w[i] <= c) {
cx[i] = 1;
cw += w[i];
cp += v[i];
Backtrack(i + 1);
cw -= w[i]; // 回溯
cp -= v[i]; // 回溯
}
// 进入右子树
cx[i] = 0;
if (Bound(i + 1) > bestp) {
Backtrack(i + 1);
}
}
int main() {
// 输入物品数量和背包容量
n = 3; // 物品数量为3
c = 30; // 背包容量为5
w = { 0, 16, 15, 15 }; // 物品体积,从索引1开始
v = { 0, 45, 25, 25 }; // 物品价值,从索引1开始
cx.resize(n + 1, 0);
bestx.resize(n + 1, 0);
Backtrack(1);
cout << "背包的获得的最大价值: " << bestp << endl;
cout << "所装的物品: ";
for (int i = 1; i <= n; i++) {
if (bestx[i] == 1) {
cout << i << " ";
}
}
cout << endl;
return 0;
}