貪心法之揹包問題解決

/*貪心法對已有的信息作出選擇,而且一旦作出選擇,不管結果如何,選擇都不會變化**/
/**貪心法之活動選擇問題**/
/**活動選擇問題就是要選擇出一個由互相兼容的活動組成的最大集合**/

/**遞歸貪心法**/
int OptimalSubset[100];
int RecursiveActivitySelector(int*s ,int *f,int index,int n){ /*s[0]和f[0]爲0,活動開始時間 和結束時間從1開始存儲*/
  int m=index+1;
  static int activity_number=0;
  while(m<=n && s[m]<=f[index])                  /**尋找開始時間晚於index結束的活動m**/
    m++;
  if(m<=n){                                                                                        /**n是假設存在的比m還要晚才能完成的活動
    OptimalSubset[activity_number++]=m;    /**選擇找到的活動
    ResursiveActivitySelector(s,f,m,n);    /**以活動m的結束時間爲基準繼續尋找 活動m是具                                                /**有最早結束時間的活動
 }
  else
     return activity_number;
}

/*迭代貪心算法
int GreedyActivitySelector(int *s,int *f,int n){
int activity_number=0;
OptimalSubset[activity_number++]=1;/**選擇活動1**/
int index=1;
int m;
for(m=2;m<=n;m++){
 if(s[m]>=f[index]){ //尋找開始時間晚於index結束的活動**/
  OptimalSubset[activity++]=m;//選擇找到的活動
   index=m;
 }
}
  return activity_number;
}

貪心算法解決揹包問題
int *GreedyKnapsack(int n,int W,int *Weights,float* Values,float *VW){
int i;
/**分配空間及初始化
float*x=(float*)malloc(sizeof(float)*n);
for(i=0;i<n;i++)
  if(Weights[i]<=W){  /**如果揹包剩餘容量可以裝下該物品
    x[i]=1;
        W=W-Weights[i];
   }
   else
    break;
   if(i<n){
     x[i]=W/(float)Weights[i];/**如果還有物品可以部分的裝入揹包
   }
   return x;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章