当前位置:文档之家› 北邮算法作业贪心算法实验报告

北邮算法作业贪心算法实验报告

北邮算法作业贪心算法实验报告
北邮算法作业贪心算法实验报告

第三次算法作业(贪心算法)

姓名:吴迪

班级:08211312

学号:08211488

班内序号15

摘要:本文为完成作业problem1,problem3,problem4,problem5的四道贪心算法题。

备注:所有后缀为_ex的可执行文件为文件输入输出模式的程序,比如problem1_ex.exe

(所有算法实现代码承诺为本人自己编写并且截图为实际有效截图,所有程序均通过Dev-C++编译器实际测试可以运行)

problem 1

特殊的01背包(原算法分析题4-3)

问题描述:01背包是在N件物品取出若干件放在空间为C的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn,并取得最大价值。普通的01背包中物品的重量和价值没有明确的关系,这里定义一种特殊的01背包:向背包中放入的物品的价值和体积成反比,也就是价值越高,体积越小,注意这里物品价值和体积的乘积并不是固定值。例如:如下的物品满足这

个“特殊的01背包”,5件物品:

物品1,价值 v=6,体积w=20

物品2,价值 v=1,体积w=60

物品3,价值 v=20,体积w=3

物品4,价值 v=15,体积w=15

物品5,价值 v=99,体积w=1

假如我有一个容量为c的背包,c=20,那么选择物品3、4、5可以获得最大价值134。

输入:首先是一个整数t,代表测试数据的组数。每组测试数据首先是两个正整数n和c,n 代表物品的个数,c代表背包的最大容积。然后有n行整数,每行有两个整数,分别代表物品的价值v和体积w。t的范围是(1-100),n的范围是(1-100000),c、v、w的范围不超过四字节的int型。

输出:首先输出测试数据的组号,例如第一组的组号为“Case 1:”,占一行。然后是一个整数,代表可以取得的最大价值,占一行。

Sample Input:

5

5 20

6 20

1 60

20 3

15 15

99 1

1 1

100 100

5 10

92 17

101 10

93 18

109 3

87 26

10 22

96 13

96 18

89 17

106 1

71 40

86 27

83 31

78 31

106 7

68 46

15 19

54 55

103 7

82 33

75 35

99 10

94 21

53 56

95 16

91 20

39 69

82 28

54 54

110 2

42 67

65 46

Sample Output:

Case 1:

134

Case 2:

Case 3:

109

Case 4:

212

Case 5:

312

问题分析:

本题是特殊的01背包问题,由于其价值和重量的反比规律易证明贪婪算法的有效性,故本题可以采用贪心算法求解,即每次优选最轻物品也是最大价值物品。

源代码:(仅附文件输入输出版本,标准输入输出版本见cpp代码文件)

#include

#include

using namespace std;

int greedy_calculate(int* v,int* w,const int n,const int c);

int main()

{

//input

int t; //test group num 1-100

int n; //object num 1-100000

int c; //capacity

int *v;

int *w;

fstream in;

fstream out;

in.open("problem1_input.txt",ios::in);

out.open("problem1_output.txt",ios::out);

in >> t;

if(t>100||t<1)

out<<"error input of t!"<

for(int i=0;i

in >> n;

if(n>100000||n<1)

out<<"error input of n!"<

in >> c;

if(c<=0)

out<<"error input of c!"<

v=new int [n];

w=new int [n];

for(int j=0;j

{

in >> v[j];

in >> w[j];

}

//output

out<<"Case "<

out<

//safety

delete v;

delete w;

}

in.close();

out.close();

system("pause");

return 0;

}

int greedy_calculate(int* v,int* w,const int n,const int c) {

unsigned int least_weight=-1;

int lw_num=0;

int count=0;

int total_value=0;

int total_weight=0;

bool *x;

x=new bool [n];

for(int i=0;i

{

x[i]=0;

}

while(total_weight<=c&&count

least_weight=-1;

for(int i=0;i

{

if(x[i]==0){

if(w[i]

{

least_weight=w[i];

lw_num=i;

}

}

}

x[lw_num]=1;

total_value+=v[lw_num];

total_weight+=w[lw_num];

count++;

}

if(total_weight>c)

{

total_value-=v[lw_num];

total_weight-=w[lw_num];

}

delete x;

return total_value;

}

运行截图

使用generate后产生的测试用例:

problem 3

最大边权最小生成树(原算法分析题4-12)

问题描述:已知图G是一个联通的图,请你构造一颗生成树,这颗生成树上最长的边比该图G 的其他生成树的最长边都要小。例如,图G的邻接矩阵如下:

0 498 49

498 0 682

49 682 0

如图:

有生成树1:

生成树2:

生成树3:

这三课生成树的最大边权分别为498、682和682,所以第一课生成树的最大边权最小,应选第一棵树。现在你的任务是,根据图的邻接矩阵,计算该图的最大边权最小的生成树的最大边长,如上例的计算结果为498。

输入:首先是一个整数t,代表测试数据的组数。每组测试数据首先是一个正整数n,n代表图G的顶点个数,n的范围是1-1000。然后有n行整数,每行有n个整数,即为图的邻接矩阵。

输出:首先输出测试数据的组号,例如第一组的组号为“Case 1:”,占一行。然后是一个整数,代表该图的最大边权最小的生成树的最大边长,占一行。

Sample Input:

5

5

0 735 749 172 215

735 0 259 493 738

749 259 0 469 309

172 493 469 0 38

215 738 309 38 0

3

0 498 49

498 0 682

49 682 0

2

0 531

531 0

5

0 257 551 743 659

257 0 697 783 758

551 697 0 320 533

743 783 320 0 708

659 758 533 708 0

6

0 632 408 364 719 156

632 0 535 285 766 379

408 535 0 374 235 687

364 285 374 0 411 853

719 766 235 411 0 536

156 379 687 853 536 0

Sample Output:

Case 1:

309

Case 2:

498

Case 3:

531

Case 4:

551

Case 5:

374

算法分析:

本题为最大最小生成树问题,因此涉及的图的边和点的保存方式等诸多问题,另外还要检测图的连通性,贪心算法每次去掉权值最高的边,然后看剩下的边是否仍能确保图的连通性,如果能,则必定可以生成一棵最小生成树,此时的最大边权就是去掉后剩下的最大边,继续这样检测直到不能连通,此时去掉的边就是必须保留的最大边。

源代码

#include

#include

using namespace std;

typedef struct Edge

{

int length;

int p1;

int p2;

}edge;

void sort_edges(edge * e,int * order,int m);

int find_max(edge * e,int * order,int m,int n);

fstream in;

fstream out;

int main()

{

int t;

int n; //点数

int m; //边数

int value;

int waste;

edge *e;

int *order; //从大到小逆序排

in.open("problem3_input.txt",ios::in); out.open("problem3_output.txt",ios::out);

in>>t;

if(t<1||t>100000)

cout<<"error input!"<

for(int i=0;i

{

in>>n;

int p=0;

if(n<1||n>1000)

cout<<"error input!"<

m=n*(n-1)/2;

e=new edge [m];

order= new int [m];

for(int j=0;j

{

for(int k=0;k

if(k>j){

in>>value;

e[p].length=value;

e[p].p1=j;

e[p++].p2=k;

}

else

in>>waste;

}

}

sort_edges(e,order,m);

/*show edges

cout<<"edges:"<

for(int j=0;j

{

cout<

} */

cout<<"Case "<

cout<

delete order;

delete e;

}

in.close();

out.close();

system("pause");

return 0;

}

void sort_edges(edge * e,int * order,int m)

{

int * x;

int max=0;

x = new int [m];

int p;

for(int i=0;i

x[i]= 0;

for(int i=0;i

{

max=0;

for(int j=0;j

if(x[j]==0){

if(e[j].length>max){

max=e[j].length;

p=j;

}

}

}

order[i]=p; //order i 记录第 j 个元素

x[p]=1;

}

delete x;

}

int find_max(edge * e,int * order,int m,int n)

{

int *w; //标记边是否在图里

int p;

int **matrix;

matrix=new int*[n];

for(int i=0;i

matrix[i]=new int [n];

w=new int [m];

for(int i=0;i

{

for(int j=0;j

{

w[j]=1;

}

for(int j=0;j<=i;j++)

{

w[order[j]]=0;

}

for(int j=0;j

{

for(int k=0;k

{

if(j==k)

matrix[j][k]=1;

else

matrix[j][k]=0;

}

}

for(int j=i+1;j

if(w[order[j]])

{

int ps1;

int ps2;

ps1=e[order[j]].p1;

ps2=e[order[j]].p2;

matrix[ps1][ps2]=1;

matrix[ps2][ps1]=1;

}

}

int step=1;int zero=1;int newl=0;

while(zero==1){

newl=0;

zero=0;

for(int j=1;j

if(matrix[0][j]==step)

{

for(int k=1;k

{

if(matrix[j][k]>=1&&matrix[0][k]==0)

{

matrix[0][k]=step+1;

newl=1; }

}

}

if(matrix[0][j]==0)

zero=1;

}

step++;

if(newl==0)

break;

}

if(newl==0&&zero==1){

delete w;

for(int j=n-1;j>=0;j--)

delete [] matrix[n];

delete []matrix;

return e[order[i]].length;

}

else if(zero==0);

}

delete w;

for(int i=n-1;i>=0;i--)

delete [] matrix[n];

delete []matrix;

return 0; //e[order[0]].length

}

运行截图

此为实验所给的测试用例,为简便采用了文本的输入输出,而generate产生的输入文件由于我的算法复杂度可能太高,因此输出时间太长。

最优合并(原算法实现题4-2)

问题描述:已知k个排好序的序列S1,S2,…,Sk,第i个序列的长度为Li。使用2路归并算法将这k个序列合并成一个序列。假设采用2路归并排序算法将长度为n和m的序列合并需要m+n-1次比较,那么将k个序列合并,每次合并两个序列,最多和最少需要多少次比较?例如有4个序列,长度为5,12,11,2

合并时的过程(其中的一种方式):

5与2合并,需比较6次,合并后序列长度为7,12,11。

7与11合并,需比较17次,合并后序列长度为18,12。

12与18合并,需比较29次,合并后序列长度为30。

最终比较6+17+29=52次。

输入:首先是一个整数t,代表测试数据的组数。每组测试数据首先是一个正整数n,n代表序列的个数。然后有n个整数,代表n个序列的长度,即Li。n的范围是1-100000,注意最终结果可能超过int型范围,请使用long long类型存储结果。

输出:首先输出测试数据的组号,例如第一组的组号为“Case 1:”,占一行。然后是两个整数,代表合并后最多比较次数与最少比较次数。

Sample Input:

5

6

10 64 90 75 49 4

7

70 29 34 84 93 2 11

8

94 42 83 50 67 17 7 20

2

30 82

8

42 45 26 34 28 27 61 15

Sample Output:

Case 1:

1247 656

Case 2:

1653 771

Case 3:

2153 1024

Case 4:

111 111

Case 5:

1417 807

源代码

#include

#include

using namespace std;

void swap(long a[],int i,int j);//from the old programe lib

int partition(long a[],int p,int r);

void QuickSort(long a[],int p ,int r);

void insert(long *l,int s,int n); //insert l[s] to sorted list long long max(long *l,int n,bool sorted);

long long min(long *l,int n,bool sorted);

int main()

{

int t;

int n;

long *l;

long long best;

long long worst;

fstream in;

fstream out;

in.open("problem4_input.txt",ios::in);

out.open("problem4_output.txt",ios::out);

if(t<1||t>100000)

out<<"error input!"<

for(int i=0;i

{

in>>n;

if(n<1||n>100000)

out<<"error input!"<

l=new long [n];

for(int j=0;j

in>>l[j];

out<<"Case "<

best=min(l,n,0);

worst=max(l,n,1);

out<

}

in.close();

out.close();

system("pause");

return 0;

}

void swap(long a[],int i,int j)

{

int temp=a[i];

a[i]=a[j];

a[j]=temp;

}

int partition(long a[],int p,int r)

{

int i=p,j=r+1;

long x=a[p];//普通快排

int mid=(p+r+1)/2;

// raise order

while(true)

{

while(a[++i]

while(a[--j]>x) ;

if(i>=j) break;

swap(a,i,j);

}

a[p] =a[j];

return j;

}

void QuickSort(long a[],int p ,int r)

{

if (p < r)

{

int q= partition(a, p , r);

QuickSort(a,p,q-1);

QuickSort(a,q+1,r);

}

}

long long max(long *l,int n,bool sorted)

{

long long result=0;

long long length=0;

if(sorted);

else

QuickSort(l,0,n-1);

length=l[n-1];

for(int i=n-2;i>=0;i--)

{

length+=l[i];

result+=length;

result--;

}

return result;

}

void insert(long *l,int s,int n) //insert l[0] to sorted list {

int i;

for(i=s+1;i

if(l[i]>l[s])

{

break;

}

i--;

long temp=l[s];

for(int j=s;j

{

l[j]=l[j+1];

}

l[i]=temp;

}

long long min(long *l,int n,bool sorted) {

long long result=0;

long length=0;

if(sorted);

else

QuickSort(l,0,n-1);

long *cl;

cl=new long [n];

for(int i=0;i

cl[i]=l[i];

//类似huffman的最小合并策略

length=cl[0];

for(int i=1;i

{

length+=cl[i];

result+=length;

result--;

cl[i]=length;

insert(cl,i,n);

length=cl[i];

}

return result;

}

运行截图

generate

算法设计与分析实验报告贪心算法

算法设计与分析实验报告 贪心算法 班级:2013156 学号:201315614 姓名:张春阳哈夫曼编码 代码 #include float small1,small2; int flag1,flag2,count; typedefstructHuffmanTree { float weight; intlchild,rchild,parent; }huffman; huffmanhuffmantree[100]; void CreatHuffmanTree(intn,int m) { inti; void select(); printf("请输入%d个节点的权值:",n); for(i=0;i

printf("\n"); for(i=0;i

触发器实验报告

实验3 触发器及其应用 一、实验目的 1、掌握基本RS、JK、D和T触发器的逻辑功能 2、掌握集成触发器的逻辑功能及使用方法 3、熟悉触发器之间相互转换的方法 二、实验原理 触发器具有两个稳定状态,用以表示逻辑状态“1”和“0”,在一定的外界信号作用下,可以从一个稳定状态翻转到另一个稳定状态,它是一个具有记忆功能的二进制信息存贮器件,是构成各种时序电路的最基本逻辑单元。 1、基本RS触发器 图5-8-1为由两个与非门交叉耦合构成的基本RS触发器,它是无时钟控制低电平直接触发的触发器。基本RS触发器具有置“0”、置“1”和“保持”三种功能。通常称S为置“1”端,因为S=0(R=1)时触发器被置“1”;R为置“0”端,因为R=0(S=1)时触发器被置“0”,当S=R=1时状态保持;S=R=0时,触发器状态不定,应避免此 种情况发生,表5-8-1为基本RS触发器的功能表。 基本RS触发器。也可以用两个“或非门”组成,此时为高电平触发有效。 表5-8-1 图5—8—1 基本RS触发器 2、JK触发器 在输入信号为双端的情况下,JK触发器是功能完善、使用灵活和通用性较强的一种触发器。本实验采用74LS112双JK触发器,是下降边沿触发的边沿触发器。引脚功能及逻辑符号如图5-8-2所示。 JK触发器的状态方程为 Q n+1=J Q n+K Q n J和K是数据输入端,是触发器状态更新的依据,若J、K有两个或两个以上输入端时,组

成“与”的关系。Q与Q为两个互补输出端。通常把Q=0、Q=1的状态定为触发器“0”状态;而把Q=1,Q=0定为“1”状态。 图5-8-2 74LS112双JK触发器引脚排列及逻辑符号 下降沿触发JK触发器的功能如表5-8-2 表 注:×—任意态↓—高到低电平跳变↑—低到高电平跳变 Q n(Q n)—现态Q n+1(Q n+1 )—次态φ—不定态 JK触发器常被用作缓冲存储器,移位寄存器和计数器。 3、D触发器 在输入信号为单端的情况下,D触发器用起来最为方便,其状态方程为 Q n+1=D n,其输出状态的更新发生在CP脉冲的上升沿,故又称为上升沿触发的边沿触发器, 触发器的状态只取决于时钟到来前D端的状态,D触发器的应用很广,可用作数字信号的寄存,移位寄存,分频和波形发生等。有很多种型号可供各种用途的需要而选用。如双 D 74LS74、四D 74LS175、六D 74LS174等。 图5-8-3 为双D 74LS74的引脚排列及逻辑符号。功能如表5-8-3。

北邮通电实验报告

实验3 集成乘法器幅度调制电路 信息与通信工程学院 2016211112班 苏晓玥杨宇宁 2016210349 2016210350

一.实验目的 1.通过实验了解振幅调制的工作原理。 2.掌握用MC1496来实现AM和DSB的方法,并研究已调波与调制信号,载波之间的关系。3.掌握用示波器测量调幅系数的方法。 二.实验准备 1.本实验时应具备的知识点 (1)幅度调制 (2)用模拟乘法器实现幅度调制 (3)MC1496四象限模拟相乘器 2.本实验时所用到的仪器 (1)③号实验板《调幅与功率放大器电路》 (2)示波器 (3)万用表 (4)直流稳压电源 (5)高频信号源 三.实验内容 1.模拟相乘调幅器的输入失调电压调节。 2.用示波器观察正常调幅波(AM)波形,并测量其调幅系数。 3.用示波器观察平衡调幅波(抑制载波的双边带波形DSB)波形。 四.实验波形记录、说明 1.DSB信号波形观察

2.DSB信号反相点观察 3.DSB信号波形与载波波形的相位比较 结论:在调制信号正半周期间,两者同相;负半周期间,两者反相。

4.AM正常波形观测 5.过调制时的AM波形观察(1)调制度为100%

(2)调制度大于100% (3)调制度为30% A=260.0mv B=140.0mv

五.实验结论 我们通过实验了解振幅调制的工作原理是:调幅调制就是用低频调制信号去控制高频振荡(载波)的幅度,使其成为带有低频信息的调幅波。目前由于集成电路的发展,集成模拟相乘器得到广泛的应用,为此本实验采用价格较低廉的MC1496集成模拟相乘器来实现调幅之功能。 DSB信号波形与载波波形的相位关系是:在调制信号正半周期间,两者同相;负半周期间,两者反相。 通过实验了解到了调制度的计算方法 六.课程心得体会 通过本次实验,我们了解了振幅调制的工作原理并掌握了实现AM和DSB的方法,学会计算调制度,具体见实验结论。我们对集成乘法器幅度调制电路有了更好的了解,对他有了更深入的认识,提高了对通信电子电路的兴趣。 和模电实验的单独进行,通电实验增强了团队配合的能力,两个人的有效分工提高了实验的效率,减少了一个人的独自苦恼。

北京理工大学《数据结构与算法设计》实验报告实验一

《数据结构与算法设计》 实验报告 ——实验一 学院: 班级: 学号: 姓名:

一、实验目的 1.通过实验实践、巩固线性表的相关操作; 2.熟悉VC环境,加强编程、调试的练习; 3.用C语言编写函数,实现循环链表的建立、插入、删除、取数据等基本操作; 4.理论知识与实际问题相结合,利用上述基本操作实现约瑟夫环。 二、实验内容 1、采用单向环表实现约瑟夫环。 请按以下要求编程实现: ①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。环表中的 结点编号依次为1,2,……,m。 ②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到 第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点 的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出 了这个环表的全部结点为止。 三、程序设计 1、概要设计 为实现上述程序功能,应用单向环表寄存编号,为此需要建立一个抽象数据类型:单向环表。 (1)、单向环表的抽象数据类型定义为: ADT Joseph{ 数据对象:D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0} 数据关系:R1={ |ai∈D,i=1,2,……,n} 基本操作: create(&L,n) 操作结果:构造一个有n个结点的单向环表L。 show(L) 初始条件:单向环表L已存在。 操作结果:按顺序在屏幕上输出L的数据元素。 Josephf( L,m,s,n) 初始条件:单向环表L已存在, s>0,n>0,s

贪心算法 会场安排问题 算法设计分析

贪心算法会场安排问题算法设计分析Description 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。) 编程任务: 对于给定的k个待安排的活动,编程计算使用最少会场的时间表。 Input 输入数据是由多组测试数据组成。每组测试数据输入的第一行有1 个正整数k,表示有k个待安排的活动。接下来的k行中,每行有2个正整数,分别表示k 个待安排的活动开始时间和结束时间。时间以0 点开始的分钟计。 Output 对应每组输入,输出的每行是计算出的最少会场数。 Sample Input 5 1 23 12 28 25 35 27 80 3 6 50

Sample Output 3 程序: #include int fnPartition(int a[], int low, int high) { int i,j; int x = a[low]; i = low; j = high; while(i =a[i]) i++; if(i -1) { n = 1; for(; i <=e; i++) if(a[i]>=b[s]) s++; else n++; } return n; } int main(void) { int n,i; while(1 == scanf("%d",&n)) { int *st = new int [n]; int *et = new int [n]; for (i = 0; i

课程设计实验报告 北邮

课程设计实验报告 -----物联网实验 学院:电子工程学院班级:2011211204 指导老师:赵同刚

一.物联网概念 物联网是新一代信息技术的重要组成部分。物联网的英文名称叫“The Internet of things”。顾名思义,物联网就是“物物相连的互联网”。这有两层意思:第一,物联网的核心和基础仍然是互联网,是在互联网的基础上延伸和扩展的网络;第二,其用户端延伸和扩展到了任何物体与物体之间,进行信息交换和通信。因此,物联网的定义是:通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物体与互联网相连接,进行信息交换和通信,以实现对物体的智能化识别、定位、跟踪、监控和管理的一种网络。 二.物联网作用 现有成熟的主要应用包括: —检测、捕捉和识别人脸,感知人的身份; —分析运动目标(人和物)的行为,防范周界入侵; —感知人的流动,用于客流统计和分析、娱乐场所等公共场合逗留人数预警; —感知人或者物的消失、出现,用于财产保全、可疑遗留物识别等; —感知和捕捉运动中的车牌,用于非法占用公交车道的车辆车牌捕捉; —感知人群聚集状态、驾驶疲劳状态、烟雾现象等各类信息。 三.物联网无线传感(ZigBee)感知系统 ZigBee是一种新兴的短距离、低功耗、低数据速率、低成本、低复杂度的无线网络技术。ZigBee在整个协议栈中处于网络层的位置,其下是由IEEE 802.15.4规范实现PHY(物理层)和MAC(媒体访问控制层),对上ZigBee提供了应用层接口。 ZigBee可以组成星形、网状、树形的网络拓扑,可用于无线传感器网络(WSN)的组网以及其他无线应用。ZigBee工作于2.4 GHz的免执照频段,可以容纳高达65 000个节点。这些节点的功耗很低,单靠2节5号电池就可以维持工作6~24个月。除此之外,它还具有很高的可靠性和安全性。这些优点使基于ZigBee的WSN广泛应用于工业控制、消费性电子设备、汽车自动化、家庭和楼宇自动化、医用设备控制等。 ZigBee的基础是IEEE802.15.4,这是IEEE无线个人区域网工作组的一项标准,被称作IEEE802.15.4(ZigBee)技术标准。ZigBee不仅只是802.15.4的名字。IEEE仅处理低级MAC

北邮微波实验报告整理版

北京邮电大学信息与通信工程学院 微波实验报告 班级:20112111xx 姓名:xxx 学号:20112103xx 指导老师:徐林娟 2014年6月

目录 实验二分支线匹配器 (1) 实验目的 (1) 实验原理 (1) 实验内容 (1) 实验步骤 (1) 单支节 (2) 双支节 (7) 实验三四分之一波长阻抗变换器 (12) 实验目的 (12) 实验原理 (12) 实验内容 (13) 实验步骤 (13) 纯电阻负载 (14) 复数负载 (19) 实验四功分器 (23) 实验目的 (23) 实验原理 (23) 实验内容 (24) 实验步骤 (24) 公分比为1.5 (25) 公分比为1(等功分器) (29) 心得体会 (32)

201121111x 班-xx 号-xx ——电磁场与微波技术实验报告 实验二 分支线匹配器 实验目的 1.熟悉支节匹配器的匹配原理 2.了解微带线的工作原理和实际应用 3.掌握Smith 图解法设计微带线匹配网络 实验原理 支节匹配器是在主传输线上并联适当的电纳(或者串联适当的电抗),用附加的反射来抵消主传输线上原来的反射波,以达到匹配的目的。 单支节匹配器,调谐时主要有两个可调参量:距离d 和由并联开路或短路短截线提供的电纳。匹配的基本思想是选择d ,使其在距离负载d 处向主线看去的导纳Y 是Y0+jB 形式。然后,此短截线的电纳选择为-jB ,根据该电纳值确定分支短截线的长度,这样就达到匹配条件。 双支节匹配器,通过增加一个支节,改进了单支节匹配器需要调节支节位置的不足,只需调节两个分支线长度,就能够达到匹配(但是双支节匹配不是对任意负载阻抗都能匹配的,即存在一个不能得到匹配的禁区)。 微带线是有介质εr (εr >1)和空气混合填充,基片上方是空气,导体带条和接地板之间是介质εr ,可以近似等效为均匀介质填充的传输线,等效介质电常数为 εe ,介于1和εr 之间,依赖于基片厚度H 和导体宽度W 。而微带线的特性阻抗与其等效介质电常数为εe 、基片厚度H 和导体宽度W 有关。 实验内容 已知:输入阻抗Z 75in ,负载阻抗Z (6435)l j ,特性阻抗0Z 75 ,介质基片 2.55r ,1H mm 。 假定负载在2GHz 时实现匹配,利用图解法设计微带线单支节和双支节匹配网络,假设双支节网络分支线与负载的距离114d ,两分支线之间的距离为21 8 d 。画出几种可能的电路图并且比较输入端反射系数幅度从1.8GHz 至2.2GHz 的变化。 实验步骤 1.根据已知计算出各参量,确定项目频率。 2.将归一化阻抗和负载阻抗所在位置分别标在Smith 圆上。 3.设计单枝节匹配网络,在图上确定分支线与负载的距离以及分支线的长度,根据给定的介质基片、特性阻抗和频率用TXLINE 计算微带线物理长度和宽度。此处应该注意电长度和实际长度的联系。 4.画出原理图,在用微带线画出基本的原理图时,注意还要把衬底添加到图中,将各部分的参数填入。注意微带 分支线处的不均匀性所引起的影响,选择适当的模型。 5.负载阻抗选择电阻和电感串联的形式,连接各端口,完成原理图,并且将项目的频率改为1.8—2.2GHz 。 6.添加矩形图,添加测量,点击分析,测量输入端的反射系数幅值。 7.同理设计双枝节匹配网络,重复上面的步骤。

算法设计与实验报告讲解

算法设计与分析实验报告 学院:信息学院 专业:物联网1101 姓名:黄振亮 学号:20113379 2013年11月

目录 作业1 0-1背包问题的动态规划算法 (7) 1.1算法应用背景 (3) 1.2算法原理 (3) 1.3算法描述 (4) 1.4程序实现及程序截图 (4) 1.4.1程序源码 (4) 1.4.2程序截图 (5) 1.5学习或程序调试心得 (6) 作业2 0-1背包问题的回溯算法 (7) 2.1算法应用背景 (3) 2.2算法原理 (3) 2.3算法描述 (4) 2.4程序实现及程序截图 (4) 2.4.1程序源码 (4) 2.4.2程序截图 (5) 2.5学习或程序调试心得 (6) 作业3循环赛日程表的分治算法 (7) 3.1算法应用背景 (3) 3.2算法原理 (3) 3.3算法描述 (4) 3.4程序实现及程序截图 (4)

3.4.1程序源码 (4) 3.4.2程序截图 (5) 3.5学习或程序调试心得 (6) 作业4活动安排的贪心算法 (7) 4.1算法应用背景 (3) 4.2算法原理 (3) 4.3算法描述 (4) 4.4程序实现及程序截图 (4) 4.4.1程序源码 (4) 4.4.2程序截图 (5) 4.5学习或程序调试心得 (6)

作业1 0-1背包问题的动态规划算法 1.1算法应用背景 从计算复杂性来看,背包问题是一个NP难解问题。半个世纪以来,该问题一直是算法与复杂性研究的热点之一。另外,背包问题在信息加密、预算控制、项目选择、材料切割、货物装载、网络信息安全等应用中具有重要的价值。如果能够解决这个问题那么则具有很高的经济价值和决策价值,在上述领域可以获得最大的价值。本文从动态规划角度给出一种解决背包问题的算法。 1.2算法原理 1.2.1、问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi ∈{0,1}, ?∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。 1.2.2、最优性原理: 设(y1,y2,…,yn)是 (3.4.1)的一个最优解.则(y2,…,yn)是下面相应子问题的一个最优解: 证明:使用反证法。若不然,设(z2,z3,…,zn)是上述子问题的一个最优解,而(y2,y3,…,yn)不是它的最优解。显然有 ∑vizi > ∑viyi (i=2,…,n) 且 w1y1+ ∑wizi<= c 因此 v1y1+ ∑vizi (i=2,…,n) > ∑ viyi, (i=1,…,n) 说明(y1,z2, z3,…,zn)是(3.4.1)0-1背包问题的一个更优解,导出(y1,y2,…,yn)不是背包问题的最优解,矛盾。 1.2.3、递推关系:

CMOS反相器数电实验报告

1.实验目的 1.1了解Schematic设计环境 1.2掌握反相器电路原理图输入方法 1.3掌握逻辑符号创建方法 2实验原理 在Schematic设计环境中本实验所用的主要菜单有Tool、Design、Window、Edit、Add、Check、Sheet、Options等项。其中常用菜单有: Tool菜单提供设计工具以及辅助命令。比如,lab4、lab5所使用的仿真工具ADE,就在Tool下拉菜单中。 Window菜单中的各选项有调整窗口的辅助功能。比如,Zoom选项对窗口放大(Zoom in)与缩小(Zoom out),fit选项将窗口调整为居中,redraw选项为刷新。 Edit菜单实现具体的编辑功能,主要有取消操作(Undo)、重复操作(Redo)、拉伸(Stretch)、拷贝(copy)、移动(Move)、删除(Delete)、旋转(Rotate)、属性(Properties)、选择(Select)、查找(Search)等子菜单,在以下实验中将大量应用。 Add菜单用于添加编辑所需要的各种素材,比如元件(Instance)或输入输出端点(pin)等。 3实验步骤 3.1在ic5141中设计的管理以库的方式进行。库管理器中包含有设计使用的工艺库和ic5141软件提供的一些元件库。无论画电路图还是设计版图,都和建库有关,所以首先建立一个库文件,方法如下: CIW界面点击File菜单,出现下拉菜单,选命令File→New→Library,出现“New Library”对话框,填入合适的信息,如图1所示。

新建库后面还将用于版图绘制,选第二个选项,即“Attach to an existing techfile”,单击“OK”按钮,完成新库的建立。 3.2电路原理图输入 设计库建好后,就可以开始画电路原理图,具体过程如下。 建立设计原理图:在CIW中选菜单单项File→New→Cellview,出现“Create new File”对话框,如图所示填写、选择相应的选项,点击OK按钮,进入原理如编辑器。

北京邮电大学通信原理软件实验报告

北京邮电大学实验报告 题目:基于SYSTEMVIEW通信原理实验报告

实验一:验证抽样定理 一、实验目的 1、掌握抽样定理 2. 通过时域频域波形分析系统性能 二、实验原理 低通滤波器频率与m(t)相同 三、实验步骤 1. 要求三个基带信号相加后抽样,然后通过低通滤波器恢复出原信号。 2. 连接各模块完成系统,同时在必要输出端设置观察窗。 3. 设置各模块参数。 三个基带信号的频率从上到下分别设置为10hz、12hz、14hz。 抽样信号频率设置为28hz,即2*14hz。(由抽样定理知,) 将低通滤波器频率设置为14hz,则将恢复第三个信号(其频率为14hz)进行系统定时设置,起始时间设为0,终止时间设为1s.抽样率设为1khz。 3.观察基带信号、抽样后的信号、最终恢复的信号波形

四、实验结果 最上面的图为原基带信号波形,中间图为最终恢复的信号波形,最下面的图为抽样后的信号波形。 五、实验讨论 从实验结果可以看出,正如前面实验原理所述,满足抽样定理的理想抽样应该使抽样后的波形图如同冲激信号,且其包络图形为原基带信号波形图。抽样后的信号通过低通滤波器后,恢复出的信号波形与原基带信号相同。 由此可知,如果每秒对基带模拟信号均匀抽样不少于2次,则所得样值序列含有原基带信号的全部信息,从该样值序列可以无失真地恢复成原来的基带信号。 讨论:若抽样速率少于每秒2次,会出现什么情况? 答:会产生失真,这种失真被称为混叠失真。 六、实验建议、意见 增加改变抽样率的步骤,观察是否产生失真。

实验二:奈奎斯特第一准则 一、实验目的 (1)理解无码间干扰数字基带信号的传输; (2)掌握升余弦滚降滤波器的特性; (3)通过时域、频域波形分析系统性能。 二、实验原理 在现代通信系统中,码元是按照一定的间隔发送的,接收端只要能够正确地恢复出幅度序列,就能够无误地恢复传送的信号。因此,只需要研究如何使波形在特定的时刻无失真,而不必追求整个波形不变。 奈奎斯特准则提出:只要信号经过整形后能够在抽样点保持不变,即使其波形已经发生了变化,也能够在抽样判决后恢复原始的信号,因为信息完全恢复携带在抽样点幅度上。 奈奎斯特准则要求在波形成形输入到接收端的滤波器输出的整个传送过程传递函数满足:,其充分必要条件是x(t)的傅氏变换X ( f )必须满足 奈奎斯特准则还指出了信道带宽与码速率的基本关系。即R B =1/T B =2? N =2B N。 式中R b 为传码率,单位为比特/每秒(bps)。f N 和B N 分别为理想信道的低通截止 频率和奈奎斯特带宽。上式说明了理想信道的频带利用率为R B /B N =2。 在实际应用中,理想低通滤波器是不可能实现的,升余弦滤波器是在实际中满足无码间干扰传输的充要条件,已获得广泛应用的滤波器。 升余弦滤波器的带宽为:。其中,α为滚降系数,0 ≤α≤1, 三、实验步骤 1.根据奈奎斯特准则,设计实现验证奈奎斯特第一准则的仿真系统,同时在必 要输出端设置观察窗。设计图如下

银行家算法设计实验报告

银行家算法设计实验报告

银行家算法设计实验报告 一.题目分析 1.银行家算法: 我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。 当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。 2.基本要求: (1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。 (2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。

(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况: A. 所申请的资源大于其所需资源,提示分配不合理不予分配并返回 B. 所申请的资源未大于其所需资源, 但大于系统此时的可利用资源,提 示分配不合理不予分配并返回。 C. 所申请的资源未大于其所需资源, 亦未大于系统此时的可利用资源,预 分配并进行安全性检查: a. 预分配后系统是安全的,将该进 程所申请的资源予以实际分配并 打印后返回。 b. 与分配后系统进入不安全状态,提示系统不安全并返回。 (4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。 3.目的: 根据设计题目的要求,充分地分析和理解题 目,叙述系统的要求,明确程序要求实现的功能以及限制条件。 明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。

算法设计(eclipse编写贪心算法设计活动安排)

陕西师大计科院2009级《算法设计与分析》课程论文集 算法设计(贪心算法解决活动安排) 设计者:朱亚君 贪心算法的计算过程如下图所示。图中每行相应于算法的一次迭代。阴影长条表示的活动是已选入集合A的活动,而空白长条表示的活动是当前正在检查相容性的活动。 图1贪心算法的计算过程图 若被检查的活动i的开始时间Si小于最近选择的活动j的结束时间fi,则不选择活动i,否则选择活动i加入集合A中。 贪心算法并不总能求得问题的整体最优解。但对于活动安排问题,贪心算法却总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。

运用贪心算法解决活动安排问题 附录: 贪心算法的实现具体程序如下: // 贪心算法实现代码 n为活动个数 s为活动开始起始时间队列 f 为活动结束队列 A为已选入集合 import java.util.Scanner; public class a { /** * @param args */ static void GreedySelector(int s[],int f[],boolean A[]) { //第一个活动为结束时间最早进入选入队列 int n=s.length; A[1]=true; int j=2; for(int i=2;i=f[j]) { A[i]=true; j=i; } else A[i]=false; } } static void paixu(int s[],int f[])//进行以结束时间的大小排序 { int n=s.length; int m; for(int i=0;if[j+1]) { m=f[j]; f[j]=f[j+1]; f[j+1]=m;//终止时间如果前一个大于后一个就交换位置

cmos模拟集成电路设计实验报告

北京邮电大学 实验报告 实验题目:cmos模拟集成电路实验 姓名:何明枢 班级:2013211207 班内序号:19 学号:2013211007 指导老师:韩可 日期:2016 年 1 月16 日星期六

目录 实验一:共源级放大器性能分析 (1) 一、实验目的 (1) 二、实验内容 (1) 三、实验结果 (1) 四、实验结果分析 (3) 实验二:差分放大器设计 (4) 一、实验目的 (4) 二、实验要求 (4) 三、实验原理 (4) 四、实验结果 (5) 五、思考题 (6) 实验三:电流源负载差分放大器设计 (7) 一、实验目的 (7) 二、实验内容 (7) 三、差分放大器的设计方法 (7) 四、实验原理 (7) 五、实验结果 (9) 六、实验分析 (10) 实验五:共源共栅电流镜设计 (11) 一、实验目的 (11) 二、实验题目及要求 (11) 三、实验内容 (11) 四、实验原理 (11) 五、实验结果 (14) 六、电路工作状态分析 (15) 实验六:两级运算放大器设计 (17) 一、实验目的 (17) 二、实验要求 (17) 三、实验内容 (17) 四、实验原理 (21) 五、实验结果 (23) 六、思考题 (24) 七、实验结果分析 (24) 实验总结与体会 (26) 一、实验中遇到的的问题 (26) 二、实验体会 (26) 三、对课程的一些建议 (27)

实验一:共源级放大器性能分析 一、实验目的 1、掌握synopsys软件启动和电路原理图(schematic)设计输入方法; 2、掌握使用synopsys电路仿真软件custom designer对原理图进行电路特性仿真; 3、输入共源级放大器电路并对其进行DC、AC分析,绘制曲线; 4、深入理解共源级放大器的工作原理以及mos管参数的改变对放大器性能的影响 二、实验内容 1、启动synopsys,建立库及Cellview文件。 2、输入共源级放大器电路图。 3、设置仿真环境。 4、仿真并查看仿真结果,绘制曲线。 三、实验结果 1、实验电路图

北邮arduino实验报告

电子电路综合实验设计 实验名称: 基于 Arduino 的电压有效值测量电路设计与实现 学院: 班级: 学号: 姓名: 班内序号:

实验 基于Arduino 的电压有效值测量电路设计与实现 一. 摘要 Arduino是一个基于开放原始码的软硬件平台,可用来开发独立运作、并具互动性的电子产品,也可以开发与PC 相连的周边装置,同时能在运行时与PC 上的软件进行交互。为了测量正弦波电压有效值,首先我们设计了单电源供电的半波整流电路,并进行整流滤波输出,然后选择了通过Arduino设计了读取电压有效值的程序,并实现使用此最小系统来测量和显示电压有效值。在频率和直流电压幅度限定在小范围的情况下,最小系统的示数基本和毫伏表测量的值相同。根据交流电压有效值的定义,运用集成运放和设计的Arduino最小系统的结合,实现了运用少量元器件对交流电压有效值的测量。 关键字:半波整流整流滤波 Arduino最小系统读取电压有效值 二. 实验目的 1、熟悉Arduino 最小系统的构建和使用方法; 2、掌握峰值半波整流电路的工作原理; 3、根据技术指标通过分析计算确定电路形式和元器件参数; 4、画出电路原理图(元器件标准化,电路图规范化); 5、熟悉计算机仿真方法; 6、熟悉Arduino 系统编程方法。 三. 实验任务及设计要求 设计实现 Arduino 最小系统,并基于该系统实现对正弦波电压有效值的测量和显示。 1、基本要求 (1)实现Arduino 最小系统,并能下载完成Blink 测试程序,驱动Arduino 数字13 口LED 闪烁; (2)电源部分稳定输出5V 工作电压,用于系统供电; (3)设计峰值半波整流电路,技术指标要求如下:

南京邮电大学算法设计实验报告——动态规划法

实验报告 (2009/2010学年第一学期) 课程名称算法分析与设计A 实验名称动态规划法 实验时间2009 年11 月20 日指导单位计算机学院软件工程系 指导教师张怡婷 学生姓名丁力琪班级学号B07030907 学院(系) 计算机学院专业软件工程

实验报告 实验名称动态规划法指导教师张怡婷实验类型验证实验学时2×2实验时间2009-11-20一、实验目的和任务 目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题。 任务:用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文章比较等多个领域。 要求:掌握动态规划法的思想,及动态规划法在实际中的应用;分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列。 二、实验环境(实验设备) 硬件:计算机 软件:Visual C++

三、实验原理及内容(包括操作过程、结果分析等) 1、最长公共子序列(LCS)问题是:给定两个字符序列X={x1,x2,……,x m}和Y={y1,y2,……,y n},要求找出X和Y的一个最长公共子序列。 例如:X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a}。它们的最长公共子序列LSC={b,c,d,a}。 通过“穷举法”列出所有X的所有子序列,检查其是否为Y的子序列并记录最长公共子序列并记录最长公共子序列的长度这种方法,求解时间为指数级别的,因此不可取。 2、分析LCS问题特征可知,如果Z={z1,z2,……,z k}为它们的最长公共子序列,则它们一定具有以下性质: (1)若x m=y n,则z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列; (2)若x m≠y n且x m≠z k,则Z是X m-1和Y的最长公共子序列; (3)若x m≠y n且z k≠y n,则Z是X和Y的最长公共子序列。 这样就将求X和Y的最长公共子序列问题,分解为求解较小规模的问题: 若x m=y m,则进一步分解为求解两个(前缀)子字符序列X m-1和Y n-1的最长公共子序列问题; 如果x m≠y n,则原问题转化为求解两个子问题,即找出X m-1和Y的最长公共子序列与找出X 和Y n-1的最长公共子序列,取两者中较长者作为X和Y的最长公共子序列。 由此可见,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列,具有最优子结构性质。 3、令c[i][j]保存字符序列X i={x1,x2,……,x i}和Y j={y1,y2,……,y j}的最长公共子序列的长度,由上述分析可得如下递推式: 0 i=0或j=0 c[i][j]= c[i-1][j-1]+1 i,j>0且x i=y j max{c[i][j-1],c[i-1][j]} i,j>0且x i≠y j 由此可见,最长公共子序列的求解具有重叠子问题性质,如果采用递归算法实现,会得到一个指数时间算法,因此需要采用动态规划法自底向上求解,并保存子问题的解,这样可以避免重复计算子问题,在多项式时间内完成计算。 4、为了能由最优解值进一步得到最优解(即最长公共子序列),还需要一个二维数组s[][],数组中的元素s[i][j]记录c[i][j]的值是由三个子问题c[i-1][j-1]+1,c[i][j-1]和c[i-1][j]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

北邮通信原理实验报告

北京邮电大学通信原理实验报告 学院:信息与通信工程学院班级: 姓名: 姓名:

实验一:双边带抑制载波调幅(DSB-SC AM ) 一、实验目的 1、了解DSB-SC AM 信号的产生以及相干解调的原理和实现方法。 2、了解DSB-SC AM 信号波形以及振幅频谱特点,并掌握其测量方法。 3、了解在发送DSB-SC AM 信号加导频分量的条件下,收端用锁相环提取载波的原理及其实现方法。 4、掌握锁相环的同步带和捕捉带的测量方法,掌握锁相环提取载波的调试方法。 二、实验原理 DSB 信号的时域表达式为 ()()cos DSB c s t m t t ω= 频域表达式为 1 ()[()()]2 DSB c c S M M ωωωωω=-++ 其波形和频谱如下图所示 DSB-SC AM 信号的产生及相干解调原理框图如下图所示

将均值为零的模拟基带信号m(t)与正弦载波c(t)相乘得到DSB—SC AM信号,其频谱不包含离散的载波分量。 DSB—SC AM信号的解调只能采用相干解调。为了能在接收端获取载波,一种方法是在发送端加导频,如上图所示。收端可用锁相环来提取导频信号作为恢复载波。此锁相环必须是窄带锁相,仅用来跟踪导频信号。 在锁相环锁定时,VCO输出信号sin2πf c t+φ与输入的导频信号cos2πf c t 的频率相同,但二者的相位差为φ+90°,其中很小。锁相环中乘法器的两个 输入信号分别为发来的信号s(t)(已调信号加导频)与锁相环中VCO的输出信号,二者相乘得到 A C m t cos2πf c t+A p cos2πf c t?sin2πf c t+φ =A c 2 m t sinφ+sin4πf c t+φ+ A p 2 sinφ+sin4πf c t+φ 在锁相环中的LPF带宽窄,能通过A p 2 sinφ分量,滤除m(t)的频率分量及四倍频载频分量,因为很小,所以约等于。LPF的输出以负反馈的方式控制VCO,使其保持在锁相状态。锁定后的VCO输出信号sin2πf c t+φ经90度移相后,以cos2πf c t+φ作为相干解调的恢复载波,它与输入的导频信号cos2πf c t 同频,几乎同相。 相干解调是将发来的信号s(t)与恢复载波相乘,再经过低通滤波后输出模拟基带信号 A C m t cos2πf c t+A p cos2πf c t?cos2πf c t+φ =A c 2 m t cosφ+cos4πf c t+φ+ A p 2 cosφ+cos4πf c t+φ 经过低通滤波可以滤除四倍载频分量,而A p 2 cosφ是直流分量,可以通过隔直

算法与设计实验报告

算法与分析实验报告软件工程专业 安徽工业大学 指导老师:许精明

实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 一:实验目的 1:掌握动态规划算法的基本思想,学会用其解决实际问题。 2:通过几个基本的实验,提高算法分析与设计能力,提高动手操作能力和培养良好的编程习惯。 二:实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 实验一:杨辉三角

问题分析: ①每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 ②第n行数之和为2^n。 ③下一行每个数字等于上一行的左右两个数字之和。 算法设计及相关源代码: public void yanghui(int n) { int[] a = new int[n]; if(n==1){ System.out.println(1); }else if(n==2) { System.out.print(1 + " " +1); }else{ a[1]=1; System.out.println(a[1]); a[2]=1;

System.out.println(a[1]+" "+a[2]); for(int i=3;i<=n;i++){ a[1]=a[i]=1; for(int j=i-1;j>1;j--){ a[j]=a[j]+a[j-1]; } for(int j=1;j<=i;j++){ System.out.print(a[j]+" "); } System.out.println(); } } } 实验结果:n=10 实验二:0-1背包问题 问题分析::令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就 j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数: (1) V(i,0)=V(0,j)=0 (2) V(i,j)=V(i-1,j) j

北邮程序设计实验报告

程序设计实践 设 计 报 告 课题名称:邮件客户端学生姓名: 班级: 2 班内序号:16 学号: 2 日期:2014.6.4

1.课题概述 1.1课题目标和主要内容 本课题主要通过MFC的方式,利用SOCKET以及SMTP相关知识,来实现邮件(可携带附件)的定向发送,借此来复习和巩固C++编程的基本思想;学习SOCKET以及SMTP的相关知识,了解复杂网络应用程序的设计方法,并独立完成一个网络应用。 1.2系统的主要功能 1.邮件的发送(不携带附件) 2.邮件的发送(携带附件) 3.邮件接收 2. 系统设计 2.1 系统总体框架 程序的功能由MyEmailClientDlg.cpp,SMTP.cpp,MailMessage.cpp,Base64.cpp, MIMECode.cpp,MIMEContentAgent.cpp,MIMEMessage.cpp,AppOctetStream.cpp, MyEmailClient.cpp,StdAfx.cpp,TextPlain.cpp来实现。其中MIMECode.cpp, MIMEContentAgent.cpp,MIMEMessage.cpp, AppOctetStream.cpp, TextPlain.cpp来对MIME 协议进行封装,Base64.cpp来对Base64编码进行封装,SMTP.cpp是对SMTP协议进行封装,MailMessage.cpp是利用MIME协议对邮件内容的一个处理,最终通过MyEmailClientDlg.cpp 来实现邮件的发送的功能。 2.2 系统详细设计 [1] 模块划分图及描述 协议模块:包括网络应用程序中的各种协议,包括STMP协议,MIME协议等。 处理模块:主要实现对数据的进行编码以及解码。 实现模块:主要内容为邮件发送的具体步骤,相关按钮操作。 [2] 类关系图及描述 协议类:CSMTP, CTEXTPlai, CMIMECode,C MIMEContentAgent,C MIMEMessage, CAppOctetStream, CTextPlain.主要为协议中信息处理的中作用 编码类:Base64, MailMessage.主要为对邮件信息的处理

相关主题
文本预览
相关文档 最新文档