0/1背包的回溯法 - webdancer's Blog
0/1背包的回溯法
解法:回溯法。
思路:在遍历的子集树的过程中,应该注意筛选出可行的解,同时当有更好的解时,不断地更新最优解。
#include<stdio.h>
#define N 4
int x[N];
int p[N];
int w[N];
int c;
int pmax;
int pcur;
int wcur;
int bound(int t){
int i,pr;
pr=pcur;
for(i=t;i<N;i++)
pr+=p[i];
if(pr>pmax)
return 1;
return 0;
}
void backtrace(int t){
int i;
if(t>=N){
if(pmax<pcur){
pmax=pcur;
for(i=0;i<N;i++)
printf("%d ",x[i]);
printf("\n");
}
}
else{
for(i=1;i>=0;i--){
x[t]=i;
if(i){
if(w[t]+wcur<=c){
wcur+=w[t];
pcur+=p[t];
backtrace(t+1);
wcur-=w[t];
pcur-=p[t];
}
}
else if(bound(t))
backtrace(t+1);
}
}
}
int main(){
c=7;
w[0]=3;
w[1]=5;
w[2]=2;
w[3]=1;
p[0]=9;
p[1]=10;
p[2]=7;
p[3]=4;
backtrace(0);
printf("the max :%d\n",pmax);
return 0;
}
评论 (0)