/*
DFS求解01背包
时间复杂度O(2^n),每个物品都有选与不选两种选择
根据背包容量进行剪枝
用vector记录选择方案,1选0弃
*/
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 20;
int w[maxn]; //容量
int v[maxn]; //价值
int n, W; //物品数、总容量
int maxV = 0; //最大价值
vector<int> trace; //记录最大价值下的物体编号
vector<int> temp; //临时
void DFS(int idx, int sumW, int sumV) //当前容积,当前价值下对idx号物体决策
{
if(n == idx) 物体最大编号为n-1(数组下标),idx==n时为边界
{
if(sumV > maxV)
{
maxV = sumV;
trace = temp;
}
return;
}
temp.push_back(0); //不选下标idx的物品
DFS(idx+1, sumW, sumV);
temp.pop_back(); //恢复
if(sumW + w[idx] <= W) //根据容积进行剪枝
{
temp.push_back(1);
DFS(idx+1, sumW+w[idx], sumV+v[idx]);
temp.pop_back();
}
}
int main()
{
cin>>n>>W;
for(int i=0; i<n; i++)
cin>>w[i];
for(int i=0; i<n; i++)
cin>>v[i];
DFS(0, 0, 0); //初始在0价值0容量的情况下决策下标为0的物品
cout<<"最大价值为"<<maxV<<endl;
cout<<"方案为:";
for(int i=0; i<n; i++)
cout<<trace[i];
return 0;
}
DFS求解01背包
最新推荐文章于 2023-07-15 22:27:36 发布