0-1背包问题是指有一组物品,每种物品都有自己的重量和价值,在限定的总重量内,选择其中若干个物品,使得物品的总价值最大。其中每种物品仅有一个,可以选择放或不放。

枚举法实现0-1背包问题的思路如下:

  1. 枚举所有可能的方案,即对于每种物品都有两种选择(放或不放),共有2的n次方种方案,其中n为物品的数量。

  2. 对于每种方案,计算出放置物品后的总价值,保留最大的价值。

  3. 返回最大的价值。

下面是使用枚举法实现0-1背包问题的代码示例:

#include <iostream>
using namespace std;

const int MAXN = 20; // 物品数量最大值
const int MAXW = 100; // 背包容量最大值

int w[MAXN]; // 物品的重量
int v[MAXN]; // 物品的价值
int n; // 物品的数量
int W; // 背包的容量

int max_value = 0; // 最大价值

void dfs(int cur, int weight, int value) // cur表示当前考虑到的物品编号,weight表示当前已经放置的物品重量,value表示当前已经放置的物品价值
{
    if (cur == n) // 所有物品都已考虑完毕
    {
        if (weight <= W && value > max_value) // 当前方案可行且价值更大
        {
            max_value = value; // 更新最大价值
        }
        return;
    }
    dfs(cur + 1, weight, value); // 不放当前物品
    dfs(cur + 1, weight + w[cur], value + v[cur]); // 放当前物品
}

int main()
{
    cin >> n >> W;
    for (int i = 0; i < n; i++)
    {
        cin >> w[i] >> v[i];
    }
    dfs(0, 0, 0); // 从第0个物品开始考虑,当前重量为0,当前价值为0
    cout << max_value << endl;
    return 0;
}

在上面的代码中,dfs函数表示深度优先搜索的过程。其中cur表示当前考虑到的物品编号,weight表示当前已经放置的物品重量,value表示当前已经放置的物品价值。当所有物品都已考虑完毕时,如果当前方案可行且价值更大,则更新最大价值。dfs函数通过递归调用实现了对所有可能的方案的枚举。最终输出最大价值即可

枚举法实现0-1背包问题

原文地址: https://www.cveoy.top/t/topic/gr6f 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录