2023年8月1日发(作者:)
java回溯法求解01背包问题_01背包问题之回溯法解01背包问题有很多种⽅法,就我知道的就有动态规划,回溯法,分⽀界限法这⼏种,下⾯就列出我的回溯法解法,以供参考int capacity; //背包容量int n; //物品数int ]; //物品重量数组int ]; //物品价值数组int cur_weight; //当前重量int cur_price; //当前价值int best_price; //当前最优值int best_]; //当前最优解int cur_]; //当前解//估计 装⼊第i个物品后能得到的最⼤价值, 从⽽做为剪枝的依据int upper_bound(int i){//计算上界int remain_capacity = capacity - cur_weight;int b = remain_capacity;//按单位重量的价值 递减序 装⼊物品while(i<=n && w[i]<=remain_capacity){remain_capacity-=w[i];b+=p[i];i++;}//装满背包if( i<=n )b+=p[i]/w[i]*remain_capacity; //准确的说这是⼀个上界,不是上确界return b;}void dfs(int i){//结束条件if(i>n){if(best_price >cur_price) //到此为⽌了,有⽤往后找了{for(int j=1;j<=n;j++)best_solution[j] =x[j];}return ;}//搜索左⼦树,要当前结点if(cur_weight+weght[i]< = capacity){cur_solution[i] = 1;cur_weight += weight[i];cur_price += price[i];dfs(i+1); cur_weight -= weight[i];cur_price -= price[i];}//搜索右⼦树,不要当前结点,即数组中下⼀个结点if(upper_bound(u+1)>best_price){ cur_solution[i]=0;dfs(i+1);}}
2023年8月1日发(作者:)
java回溯法求解01背包问题_01背包问题之回溯法解01背包问题有很多种⽅法,就我知道的就有动态规划,回溯法,分⽀界限法这⼏种,下⾯就列出我的回溯法解法,以供参考int capacity; //背包容量int n; //物品数int ]; //物品重量数组int ]; //物品价值数组int cur_weight; //当前重量int cur_price; //当前价值int best_price; //当前最优值int best_]; //当前最优解int cur_]; //当前解//估计 装⼊第i个物品后能得到的最⼤价值, 从⽽做为剪枝的依据int upper_bound(int i){//计算上界int remain_capacity = capacity - cur_weight;int b = remain_capacity;//按单位重量的价值 递减序 装⼊物品while(i<=n && w[i]<=remain_capacity){remain_capacity-=w[i];b+=p[i];i++;}//装满背包if( i<=n )b+=p[i]/w[i]*remain_capacity; //准确的说这是⼀个上界,不是上确界return b;}void dfs(int i){//结束条件if(i>n){if(best_price >cur_price) //到此为⽌了,有⽤往后找了{for(int j=1;j<=n;j++)best_solution[j] =x[j];}return ;}//搜索左⼦树,要当前结点if(cur_weight+weght[i]< = capacity){cur_solution[i] = 1;cur_weight += weight[i];cur_price += price[i];dfs(i+1); cur_weight -= weight[i];cur_price -= price[i];}//搜索右⼦树,不要当前结点,即数组中下⼀个结点if(upper_bound(u+1)>best_price){ cur_solution[i]=0;dfs(i+1);}}
发布评论