【算法笔记】回溯法——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){
if(t > n){
if(cur_v > max_v){
max_v = cur_v;
}
return;
}
if(left_c >= w[t]){
x[t] = 1;
left_c -= w[t];
cur_v += v[t];
backtrack(t + 1);
left_c += w[t];
cur_v -= v[t];
}
x[t] = 0;
backtrack(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;
}