码迷,mamicode.com
首页 > 其他好文 > 详细

利用回溯法求解背包问题

时间:2014-10-22 23:19:23      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   for   sp   div   问题   log   

  最近看完了利用回溯法求八皇后问题,最后成功求解到92种解法,然后在看利用贪心求解背包问题,突然想到其实也可以利用回溯法求解背包问题,本质上回溯法是一个穷举的方式在求.

  回溯法求解出的结果肯定是正确的,这也可以验证自己所写的贪心算法的正确性.

问题描诉:

  设定Wmax为最大重量,W[](0~n-1)为编号0~n-1的货物重量,V[](0~n-1)为其价值,x[]为其中解,

  在wn=ΣXi*Wi<Wmax的条件下,求Vmax=ΣXi*Vi.

代码如下:


//全局变量最大价值int maxvalue=0;
//当前最优解
int an_x[10]; //w为重量数组
//va为价值数组
//wmax为最大的重量
//n为货物数量
//n_w未加入当前货物的重量
//x为一个解集合
//value为未加入当前货物价值的价值
//index当前货物的索引
void get_max_sample(int *w,int *va,int wmax,int n,int n_w,int *x,int value,int index) { int i; if(index==10) { if(maxvalue<value) { for(i=0;i<10;i++) an_x[i]=x[i]; maxvalue=value; } return; } for(i=0;i<2;i++) { x[index]=i; if(n_w+i*w[index]<wmax) { get_max_sample(w,va,wmax,n,n_w+i*w[index],x,value+i*va[index],index+1); } x[index]=0; } }
//求解实例
//get_max_sample(w,va,20,10,0,x,0,0);
//

 

 时间复杂度分析:

  由于每一个递归的执行的次数为2次,所以其时间复杂度为:T(2n),所以在n在较小的情况下使用这种方法是可行的,像求解的实例货物数目是10个,T=210=1024,而实际运算的次数肯定是小于这个值.

 


贪心算法的求解:

 

 

  

利用回溯法求解背包问题

标签:style   blog   color   使用   for   sp   div   问题   log   

原文地址:http://www.cnblogs.com/zy-sudo/p/4044411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!