#include <iostream>
using namespace std;
// 城市数量
#define N 4
//背包空间
#define R 5
int value[N] = {2, 4, 4, 5};
int weigh[N] = {1, 2, 3, 4};
// #define N 20
// #define R 200
// int weigh[N] = {24, 42, 20, 7, 48, 4, 3, 7, 52, 50, 5, 9, 14, 9, 55, 40, 35, 33, 12, 65};
// int value[N] = {50, 60, 49, 15, 115, 11, 8, 5, 66, 25, 8, 25, 40, 22, 42, 30, 49, 16, 12, 127};
int maxbag = 0;// 最大价值
int nowbag = 0;// 当前价值
int nowweight = 0;// 当前重量
//使用二进制位表示物品选择情况,1代表在背包中,0代表不在背包中
int S = 0;// 最大价值物品选择情况
int V = 0;// 物品选择情况
void Bag(int t)
{
if (t == N && (nowbag > maxbag || maxbag == 0))// 物品全部选完,
// 或者当前价值大于最大价值,或者最大价值为0, 更新最大价值, 更新最大价值物品选择情况
{
maxbag = nowbag;
S = V;
return;
}
else
{
for (int i = t; i < N; i++)
{
if (nowweight + weigh[i] <= R)
{
nowbag += value[i];
V += 1 << i;//入包
nowweight += weigh[i];
Bag(i + 1);//下一个物品
V -= 1 << i;
nowweight -= weigh[i];
nowbag -= value[i];
}
else
Bag(i + 1);
}
}
}
void printans()
{
for (int i = 0; i < N; i++)
if ((1 << i) & S)
cout << "第" << i + 1 << "个物品被选中" << endl;
}
int main()
{
Bag(0);
cout << "最大价值为:" << maxbag << endl;
cout << "物品选择情况为:" << endl;
printans();
system("pause");
return 0;
}