【算法笔记】回溯法——01背包问题
#include<iostream>
using namespace std;
#define N 1000
int n; //物品数量
int c; //背包总容量
int left_c; //背包剩余容量
int v[N]; //物品价值
int w[N]; //物品重量
int x[N]; //记录结果的选择情况
int best[N]; //记录最优解
int cur_v; //当前价值
int max_v = 0; //保存当前最大价值
void backtrack(int t){ //只有装得下第t个物品,才装t-------1
if(t > n){ //到达叶节点
if(cur_v > max_v){
max_v = cur_v;
}
return;
}
if(left_c >= w[t]){ //装得下第t个物品,装t-------1
x[t] = 1;
left_c -= w[t];
cur_v += v[t];
backtrack(t + 1); //递归,选择第t+1个物品
/*递归完了之后要恢复*/
left_c += w[t];
cur_v -= v[t];
}
x[t] = 0; //不装t -------0
backtrack(t + 1); //递归,选择第t+1个物品
}
int main(){
cin>> n >> c;
left_c = c;
cur_v = 0;
for(int i = 1; i <= n; i++){
cin>>v[i];
}
for(int i = 1; i <= n; i++){
cin>>w[i];
}
backtrack(1);
cout<<max_v;
return 0;
}