枚举法实现0-1背包问题
0-1背包问题是指有一组物品,每种物品都有自己的重量和价值,在限定的总重量内,选择其中若干个物品,使得物品的总价值最大。其中每种物品仅有一个,可以选择放或不放。
枚举法实现0-1背包问题的思路如下:
-
枚举所有可能的方案,即对于每种物品都有两种选择(放或不放),共有2的n次方种方案,其中n为物品的数量。
-
对于每种方案,计算出放置物品后的总价值,保留最大的价值。
-
返回最大的价值。
下面是使用枚举法实现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函数通过递归调用实现了对所有可能的方案的枚举。最终输出最大价值即可
原文地址: https://www.cveoy.top/t/topic/gr6f 著作权归作者所有。请勿转载和采集!