《实用算法的分析与程序设计》的读书笔记(第1天)

原创 2002年08月17日 10:16:00

       由于很多网友的推荐,终于使我静下心来好好的看一下《实用算法的分析与程序设计》这本书!果然是名付其实!现在将我看书过程中遇到的题目用c++给出,原文是用pascal给出的!很多朋友甚至因为这个原因而放弃这本书!很可惜!注:这些程序我都在bc5。0中通过了!

       递推 第4页

    一辆重型卡车欲穿过1删公里的沙漠,卡车耗油为1升/公里,卡车总裁油能力为500
公升。显然卡车装一次油是过不了沙漠的。因此司机必须设法在沿途建立几个储油点,
使卡车能顺利穿越沙漠,试问司机如何建立这些贮油点?每一贮泊点应存多少汽油,才能
使卡车以消耗最少汽油的代价通过沙漠?
    题解:
     	#include<iostream.h>
	#include<iomanip.h>
	void oil_lib()
{
	int k;float d,dl; 
	float oil[10],dis[10];
 	cout<<"No."<<setw(20)<<" distance(k.m)"<<setw(90)<<" oil(l.)"<<endl;
	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<k;i++)
		cout<<i<<setw(20)<<(1000-dis[k-i])<<setw(90)<<oil[k-i]<<endl;
}
贪心法 第10页
    有一个贼在偷窃一家商店时发现有N件物品:第i件物品值Vi元,重Wi磅,(1<=i
<=n),  此处Vi和Wi都是整数。他希望带走的东西越值钱越好,但他的背包中最多只能
装下W磅的东西(W为整数)。

    如果允许小偷可带走某个物品的一部分,小偷应该带走哪几件东西,  每件东西
的重量是多少?
	题解:
#include<iostream.h>
#include<stdio.h>
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<n;i++)
    cout<<list[i].num<<" "<<list[i].w<<" "<<list[i].v<<endl;
   cout<<endl;
}
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<N;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<N){
    W-=list[j].w;
      V+=list[j].v;
    printf("%d%8.2f%8.2f/n",list[j].num,list[j].w,list[j].v);
      j++;
   }
   if(j<N&&W!=0){
    V+=W*list[j].vper;
      printf("%d%8.2f%8.2f/n",list[j].num,W,W*list[j].vper);
      W=0;
   }
   cout<<"total value: "<<V<<endl;
}
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<iostream.h>
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<n;i++)
    cout<<list[i].k<<" "<<list[i].d<<" "<<list[i].w<<endl;
   cout<<endl;
}
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<N;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<N;i++){
    t=0;
      for(j=0;j<num;j++)
       if(list[pck[j]].d<=num)
          t++;
     /* cout<<"t:"<<t<<" ";*/
      if(t<list[i].d){
         pck[num]=i; list[i].k=-list[i].k; j=num++;    /*cout<<"j:"<<j<<" ";*/
         while(j>0){
          if(list[pck[j]].d<list[pck[j-1]].d){
             t=pck[j];pck[j]=pck[j-1];pck[j-1]=t;
            }
            j--;
         }
      }
   }
   for(i=0;i<num;i++)
    cout<<(-list[pck[i]].k)<<"  ";
   cout<<endl;
   for(i=0;i<N;i++)
    if(list[i].k>0){
       cout<<list[i].k<<"  ";
         sum+=list[i].w;
      }
   cout<<endl;
   cout<<"total fine= "<<sum<<endl;
}
int main()
{
 int N;
   cin>>N;
   Tasks_with_limit_and_fine(N);
   return 1;
}

 
 

实用算法的分析与程序设计——贪心算法(包含实例,代码)

包含删数问题,0-1背包和部分背包问题贪心法也是从问题的某一个初始解出发,向给定的目标递推,但不同的是,推进的每一步不是依据某一固定的递推式,而是做一个当时看似最佳的贪心选择,不断地将问题实例归纳为更...
  • oMengLiShuiXiang1234
  • oMengLiShuiXiang1234
  • 2015年05月08日 10:42
  • 1170

《图灵程序设计丛书 算法》第4版.pdf:

《图灵程序设计丛书:算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针...
  • cf406061841
  • cf406061841
  • 2017年05月10日 14:25
  • 452

程序设计与算法 第十周测验

程序设计与算法 第十周测验
  • xiewen99
  • xiewen99
  • 2016年10月24日 17:31
  • 339

神经网络与深度学习第一天读书笔记

书本来源 概念:感知器、S型神经元 感知器(Perceptrons) 一个感知器接受几个二进制的输入,得到一个二进制输出。 书上举例是三个,可以有更多输入。 threshold表示阈值...
  • hahajinbu
  • hahajinbu
  • 2016年07月28日 20:39
  • 740

《MQL4实用编程》读书笔记(1)

《MQL4实用编程》读书笔记(1) “MQL4实用编程”是《用MQL4编程》一书的下半部分。 内容包括:交易操作方法,简单脚本、操盘手、指标的编程原则,常用函数,还有些简单的应用程序示例。 “创建实...
  • lawme
  • lawme
  • 2014年03月22日 23:57
  • 2210

读《计算机程序设计艺术》卷1:基本算法(第3版)

共5卷,高德纳 第4卷写了三本,A,B,C 还计划写第6卷和第7卷 数学家,是什么样子的,看这本书去找答案。 习题说明 题1,M20:如果习题涉及的数学概念或者动机大大超...
  • wide288
  • wide288
  • 2017年12月18日 10:36
  • 172

计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)

计算机算法设计与分析(第4版) 目录 1 算法概述2 递归与分治策略3 动态规划4 贪心算法5 回溯法6 分支限界法7 随机化算法8 线性规划与网络流 ...
  • cteng
  • cteng
  • 2014年10月07日 22:54
  • 2843

18_集合_第1天(Collection、迭代器、泛型)

第18天 集合 集合 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据。 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据。那么...
  • w1103693423
  • w1103693423
  • 2018年01月05日 16:39
  • 63

《C语言程序设计》读书笔记

写在前面:   《C程序设计》可以说是一本再基础不过的编程书了,但每读一遍的感觉却都是不同的,可以说,每读一遍,都会有很多新的收获。真所谓老书再读,回味无穷啊!此笔记是《C程序设计》谭浩强编著,清华大...
  • libo_163
  • libo_163
  • 2005年12月24日 22:37
  • 3606

《算法设计与分析基础 第二版》pdf

下载地址:网盘下载 内容简介 编辑   国外经典教材·计算机科学与技术:该书作者基于教学经验,开发了一套对算法进行分类的新方法。内容包括算法效率分析基础、蛮力...
  • cf406061841
  • cf406061841
  • 2017年05月27日 19:02
  • 530
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《实用算法的分析与程序设计》的读书笔记(第1天)
举报原因:
原因补充:

(最多只允许输入30个字)