具体思路为下方链接:
回溯法:0-1背包问题(C++实现)_BJM‘s blog.-CSDN博客_回溯法背包问题代码
我这里将代码进行了优化和修改,方便用户使用,只需要修改关键数据即可
代码如下:
#include <iostream>
using namespace std;
int bagCap = 165; //背包容量大小
int weights[11] = { 0,23,31,29,44,53,38,63,85,89,82 }; //每个物品的重量
int values[11] = { 0,92,57,49,68,60,43,67,84,87,72 }; //每个物品的价值
int items[11]; //解的记录
int packageNum = 10; //物品的数量
int bestX[11]; //最优解;BestX[i]=1代表物品i放入背包,0代表不放入
//int weights[6] = { 0 , 12 , 7 , 11 , 8 , 9 };
//int values[6] = { 0 , 24, 13 ,23 , 15, 16 };
//int bagCap = 26;
//int items[6];
//int packageNum = 5;
//int bestX[6];
//bestX在找到一个叶子节点时进行约束函数的判断,满足的话就连同修改储存的最优解
int bestValue = 0; //最优值;当前的最大价值,初始化为0
int curWeight = 0; //当前放入背包的物品总重量
int curValue = 0; //当前放入背包的物品总价值
void output()
{
//cout << "最优值是:" << BestValue << endl;
for (int i = 1; i <= packageNum; i++)
{
if (i == packageNum)
{
cout << bestX[i];
}
else {
cout << bestX[i] << "->";
}
}
}
//回溯函数,参数t表示当前处在第几层做抉择,t=1时表示当前在决定是否将第一个物品放入背包
void backTrack(int t)
{
//叶子节点,输出结果
if (t > packageNum)
{
//如果找到了一个更优的解
if (curValue > bestValue)
{
//保存更优的值和解
bestValue = curValue;
for (int i = 1; i <= packageNum; ++i)
bestX[i] = items[i];
}
}
else
{
//遍历当前节点的子节点:0不放入背包,1放入背包
for (int i = 0; i <= 1; ++i)
{
items[t] = i;
if (i == 0) //不放入背包
{
backTrack(t + 1);
}
else //放入背包
{
//约束条件:放的下
if ((curWeight + weights[t]) <= bagCap)
{
curWeight += weights[t];
curValue += values[t];
backTrack(t + 1);
curWeight -= weights[t];
curValue -= values[t];
}
}
}
}
}
int main()
{
backTrack(1);
output();
return 0;
}