01背包回溯解法c++

#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;
}

posted @ 2024-05-30 11:45  CV小能手chh  阅读(9)  评论(0)    收藏  举报  来源