- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计与理论
大 作 业
班级: 三班
学号: 104972071127
姓名: 闫春香
第一题:
令则,则
代入g(n)=O(1)和f(n)=O(n):
代入g(n)=O(1)和f(n)=O(1):
第二题:
(1)该题的算法用的是多段图的向后处理算法,存储方式是用二维数组,a个资源投资n个项目,动态规划方程描绘如下:
在时:;
当时
,其中;
当时
为j个资源分配i-1个项目时所产生的最大效益,它表示的是一种状态;为项目i投资资源j时所产生的效益。
(2)算法设计思想如下:
首先画出多段图,用n+1段图来表示,每一段有a+1个节点,表示把j个资源分配1,2,…i-1个项目,边具有的形式,。
算法详细描述:
Procedure BGraph( int resource, int projectNum, int *g[])
//以下数组可以动态申请;projectNum+1 ×resource+1
int v[i][j];//v存放前 i-1个项目投资了j个资源时所产生的效益;
int p[i][j];//p存放结果,初始为0,如果g[i][j]选定则p[i][j]为1;同时表示第i个项目//应投资j个资源;
int d[i][j];//是存放路径;i表示第i+1段,j是第i+1段的某个节点,s=d[i][j]是i段的某个节点,该节点能使(i+1,j)产生最大值;
for i=2 to projectNum do
for j=0 to resource do
if i=2 do //要为第二段单独赋值
v[i][j]=g[i-1][j];
if(resource == 1)//资源共一个时单独处理
cost=max{v[i][j]}//cost 保存最大值;
p[1][j]=1;//此时的投资决策也确定
endif
endif
else
for k=0 to j do//这步确定到达(i,j)使v[i][j]产生最大值的节点
cost=max{v[i-1][k] + g[i-1][j-k]}
t=k;//t 用来记录前一个节点
repeat//for k
d[i-1][j] = t;//记录节点,到第i,j节点的最大值是i-1,t;
v[i][j] = cost;//保存了当前状态的最大值
repeat//for j
repeat//for i
//下面单独处理最后一段
for i=0 to projectNum do
for j=0 to resource-i do
sum=max{v[projectNum][u] + g[projectNum][w] }
p[i][j]=1//在最后一段可以确定
repeat//for j
repeat// for i
//回溯寻找路径!
for i=projectNum-1 to i=2 by -1 do
s = d[i][a];//a是第n段所选的节点,据此能找到前面的;
p[i][a-s] = 1;//确定结果
a = s;
repeat//
//打印输出
end BGRAPH
(3)在c语言下实现,代码如下:
// ResourcePlanning.cpp : 定义控制台应用程序的入口点。
//
#include stdafx.h
#include stdio.h
void BGraph(int resource, int projectNum, int *g[])
{
int **v, **p, **d;
int s = 0,t = 0;//保存记录
int cost = 0; // 记录节点状态效益值
/////////////////////////////////////////////////////////////////////
v = new int *[projectNum+1];//保存每段的状态
p = new int *[projectNum+1];//记录gnet效益值分配
d = new int *[projectNum+1];//记录路径;
for(int i = 0; i = projectNum; i++)//动态申请!
{
v[i] = new int[resource + 1]; //资
文档评论(0)