时间复杂度指数级
剪枝操作确实可以减去数倍的计算时间
clock_t start1,finish1,start2,finish2;
double duration1,duration2;
const int maxn=40;
int n,v,maxValue=0;//物品件数,背包容量,最大价值
int w[maxn],c[maxn];//每件物品的质量和价值
void dfs(int index,int sumw,int sumc){
//深度搜索,index为当前处理的物品编号
//sumw为当前总重量,sumc为当前总价值
if(index==n){//已经完成对n件物品的选择
if(sumw<=v&&sumc>maxValue){
maxValue=sumc;
//不超过背包容量时候更新最大价值
}
return;
}
//岔路口
dfs(index+1,sumw,sumc);//不选第index件物品
dfs(index+1,sumw+w[index],sumc+c[index]);
//选择第index件物品
}
//剪枝
int ans=0;
void DFS(int index,int sumw,int sumc){
if(index==n){
return;
}
DFS(index+1,sumw,sumc);
if(sumw+w[index]<=v){
if(sumc+c[index]>ans){
ans=sumc+c[index];
}
DFS(index+1,sumw+w[index],sumc+c[index]);
}
}
int main(){
scanf("%d%d",&n,&v);
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&c[i]);
}
start1 = clock();
dfs(0,0,0);
finish1= clock();
start2=clock();
DFS(0,0,0);
finish2=clock();
duration1 = (double)(finish1- start1) / CLOCKS_PER_SEC;
duration2 = (double)(finish2- start2) / CLOCKS_PER_SEC;
printf("%d %g\n",maxValue,duration1);//枚举
printf("%d %g\n",ans,duration2);//剪枝
return 0;
}
//这是测试结果
34 250
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
4 5 1 3 7 6 4 18 6 7 19 30 45 20 16 17 32 17 76 89 43 32 67 87 90 32 68 99 78 56 67 98 101 105
843 90.29
843 32.728//剪枝
//单位是秒
//快了两倍左右,当然了,具体问题还是要具体分析