子集树:01背包问题
给出一些物品,每个物品有对应的重量w和价值v,背包容量c,每个物品只能选择装或者不装,所选物品的重量不能超过背包容量,要求物品价值最大。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int w[] = { 4,5,1,3,6,8,7,9 }; //重量
int v[] = { 7,4,5,2,3,6,8,9 }; //价值
const int num = sizeof(w) / sizeof(w[0]);
vector<int> x; //选择物品的下标
vector<int> y; //选择物品的下标
int c = 20; //背包容量
int cw = 0; //所选物品重量
int cv = 0; //所选物品价值
int maxVal = 0; //最大价值
void func(int i)
{
if (i == num)
{
int val = 0;
for (int s : x)
{
val += v[s];
}
if (maxVal < val)
{
maxVal = val;
y = x;
}
}
else
{
if (cw + w[i] <= c)
{
cw += w[i];
cv += v[i];
x.push_back(i);
func(i + 1);
x.pop_back();
cw -= w[i];
cv -= v[i];
}
func(i + 1);
}
}
int main()
{
func(0);
cout << maxVal << endl;
for (int i : y)
{
cout << i << " ";
}
cout << endl;
}