#include <bits/stdc++.h>
using namespace std;
int n,c,cp=0,cw=0,bestp=0;
int w[105],v[105];
int bound(int i){
/*
int cleft=c-cw;//剩余重量
int b=cp;
while(i<=n&&w[i]<=cleft){
cleft-=w[i];
b+=v[i];
}
if(i<=n){
b+=v[i]*cleft/w[i];
}
*/
int rp=0;
while(i<=n){
rp+=v[i];
i++;
}
return cp+rp;
}
void backtrack(int i){
//递归出口
if(i>n){
if(cp>bestp)
bestp=cp;
return;
}
//左子树可行
if(cw+w[i]<=c){
cw+=w[i];
cp+=v[i];
backtrack(i+1);
//恢复状态
cw-=w[i];
cp-=v[i];
}
if(bound(i+1)>bestp)
backtrack(i+1);
}
int main(){
cin>>c>>n;
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
backtrack(1);
cout<<bestp;
}
回溯法0-1背包问题
于 2022-06-19 14:32:13 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)