《實用演算法的分析與程式設計》的讀書筆記(第1天) (轉)

worldblog發表於2007-12-13
《實用演算法的分析與程式設計》的讀書筆記(第1天) (轉)[@more@]

  由於很多網友的推薦,終於使我靜下心來好好的看一下《實用演算法的分析與設計》這本書!果然是名付其實!現在將我看書過程中遇到的題目用c++給出,原文是用pascal給出的!很多朋友甚至因為這個原因而放棄這本書!很可惜!注:這些程式我都在bc5。0中透過了!

  遞推 第4頁

一輛重型卡車欲穿過1刪公里的沙漠,卡車耗油為1升/公里,卡車總裁油能力為500 公升。顯然卡車裝一次油是過不了沙漠的。因此司機必須設法在沿途建立幾個儲油點,使卡車能順利穿越沙漠,試問司機如何建立這些貯油點?每一貯泊點應存多少汽油,才能使卡車以消耗最少汽油的代價透過沙漠? 題解:


#include


#include


void oil_lib()


{


int k;float d,dl;


float oil[10],dis[10];


cout<

k=1;


d=500;


dis[1]=500;


oil[1]=500;


do{


k++;


d+=500/(2*k-1);


dis[k]=d;


oil[k]=oil[k-1]+500;


}while(d<1000);


dis[k]=1000;


dl=1000-dis[k-1];


oil[k]=dl*(2*k+1)+oil[k-1];


for(int i=0;i

cout<

}


貪心法 第10頁

有一個賊在偷竊一家商店時發現有N件物品:第i件物品值Vi元,重Wi磅,(1<=i <=n), 此處Vi和Wi都是整數。他希望帶走的東西越值錢越好,但他的揹包中最多隻能裝下W磅的東西(W為整數)。


如果允許小偷可帶走某個物品的一部分,小偷應該帶走哪幾件東西, 每件東西的重量是多少?


題解:


#include
#include
const maxn=1000;
class Node{
public:
 Node(){}
  Node(int a,float b,float c):num(a),w(b),v(c){vper=c/w;}
 int num; float w,v,vper;
};
Node list[maxn],lt[maxn];
void print(int n)
{
 for(int i=0;i   cout<  cout<}


void merge(int p,int q,int r)
{
 int i,j,t;
  t=p;i=p;j=q+1;
  while(t<=r){
   if( (i<=q)&&((j>r)||(list[i].vper>=list[j].vper)) ){
   lt[t]=list[i]; i++;
  }else{ lt[t]=list[j]; j++;  }
  t++;
  }
  for(int s=p;s<=r;s++)
   list[s]=lt[s];
}
void merge_sort(int p,int r)
{
  int q;
  if(p!=r){
   q=(p+r)/2;
  merge_sort(p,q);
  merge_sort(q+1,r);
  merge(p,q,r);
  }
}
void Partial_Bag_Problem(int N,float W)
{
 float V=0;
  float w,v;
  for(int i=0;i   cin>>w>>v;
  Node node((i+1),w,v);
  list[i]=node;
  }
  /*print(N)*/
  merge_sort(0,N-1);
  /*print(N)*/
  int j=0;
  while(W>list[j].w&&j   W-=list[j].w;
  V+=list[j].v;
   printf("%d%8.2f%8.2fn",list[j].num,list[j].w,list[j].v);
  j++;
  }
  if(j   V+=W*list[j].vper;
  printf("%d%8.2f%8.2fn",list[j].num,W,W*list[j].vper);
  W=0;
  }
  cout<}
int main()
{
 int N,W;
  cin>>N>>W;
  Partial_Bag_Problem(N,W);
  return 1;
}


 


貪心法 第15頁

任務排程問題 一個單位時間任務是個作業,如要在上執行一個程式,它恰覆蓋一個單位的執行時間。給定一個單位時間任務的集合S,對S的一個排程即S的一個排列,其中規定了這些任務的順序。該排程中的第一個任務開始於時間0,結束於時間15第二個任務開始於時間1,結束於時間2;……。 單上具有期限和罰款的單位時間任務排程問題的輸人如下: 1.包含n個單位時間任務的集合S=f1,2,……,n75 2.n個取整的期限d1,I。.…,d n,(1<d5之n),任務i要求在di前完成; 3.21個非負的權(或罰款)w:,·,b…,wno如果任務i沒在時間di之前結束罰款w5;. 要求找出S的一個排程,使之最小化總的罰款。


題解:


 #include
const maxn=500;
class Node{
public:
 Node(){}
  Node(int a,int b,int c):k(a),d(b),w(c){}
  int k,d,w;
};
Node list[maxn],lt[maxn];
void print(int n)
{
 for(int i=0;i   cout<  cout<}


void merge(int p,int q,int r)
{
 int i,j,t;
  t=p,i=p,j=q+1;
  while(t<=r){
   if((i<=q)&&((j>r)||(list[i].w>=list[j].w)))
   lt[t]=list[i++];
  else lt[t]=list[j++];
  t++;
  }
  for(int s=p;s<=r;s++)
   list[s]=lt[s];
}
void merge_sort(int p,int r)
{
 int q;
  if(p!=r){
   q=(p+r-1)/2;
  merge_sort(p,q);
  merge_sort(q+1,r);
  merge(p,q,r);
  }
}
void Tasks_with_limit_and_fine(int N)
{
  int d,w;
  int pck[maxn];
  int num=0,t,sum=0;  /*當前完成的任務個數  罰款總數*/
 for(int i=0;i   cin>>d>>w;
  Node node((i+1),d,w);
  list[i]=node;
  }
  /*print(N);*/
  merge_sort(0,N-1);
  /*print(N);*/
  int i,j;
  for(i=0;i   t=0;
  for(j=0;j   if(list[pck[j]].d<=num)
   t++;
  /* cout<  if(t  pck[num]=i; list[i].k=-list[i].k; j=num++;  /*cout<  while(j>0){
   if(list[pck[j]].d   t=pck[j];pck[j]=pck[j-1];pck[j-1]=t;
  }
  j--;
  }
  }
  }
  for(i=0;i   cout<  cout<  for(i=0;i   if(list[i].k>0){
   cout<  sum+=list[i].w;
  }
  cout<  cout<}


int main()
{
 int N;
  cin>>N;
  Tasks_with_limit_and_fine(N);
  return 1;
}



 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992860/,如需轉載,請註明出處,否則將追究法律責任。

相關文章