动态规划算法的c语言代码

希望下面能帮到你。

我只给出向前处理的代码,

你可以改变后处理,

否则,我会帮你做作业。

可以从递归的“tmp”开始

=

w GetBestpathF(g,

我,

s,

n,

路径);请参见中的递归公式

功能名称:

GetBestpathF()

参数描述:

g

表示“以某方式写的东西”: autograph

,多段图形对象

t

-int,源点

s

-int,汇点

n

-int,汇总点数

小路

顶点

*,

记录中间路径

功能描述:

逆向加工。

该函数返回多段图最短路径,

并记录最短路径的中间节点。

漂浮物

GetBestpathF(图形

g,

(同Internationalorganizations)国际组织

t,

(同Internationalorganizations)国际组织

s,

(同Internationalorganizations)国际组织

n,

顶点

*路径)

{

漂浮物

终端监督程式(Terminal Monitor Program的缩写)

=

MaxValue

漂浮物

费用

=

MaxValue

如果

(t==s)

返回

0;

否则{

(int

I = 0;

ig。NumOfVertices();

i ){

漂浮物

w

=

g.GetWeight(t,

I);

如果

(w!=0

w!=最大值){

//T点到I点的路径存在。

终端监督程式(Terminal Monitor Program的缩写)

=

w GetBestpathF(g,

我,

s,

n,

路径);

从//t的下一个点I到sink S的最优路径值。

如果

(tmpcost){

费用

=

tmp

AddtoPath(t,

我,

路径);

}

}

}

}

返回

成本;

}

如何用C语言实现动态编程? 动态规划主要是一个状态-状态转换方程。转移方程写好了,程序自然就出来了。

对于这个问题,dp[i][j]表示走到格子(I,j)时和的最大值,val[i][j]表示格子(I,j)的值。

然后就是DP [I] [j] = max (DP [I-1] [j],DP[I][j-1])val[I][j];

当然,要特别考虑边界问题。

for(int I = 1;I = m;我)

for(int j = 1;j = n;j)

{

如果(i == 1)....;

else if( j == 1)....;

else dp[i][j] = max( dp[i-1][j],DP[I][j-1])val[I][j];

}

最后dp[m][n]就是答案。

c语言用动态编程的思想输出斐波那契数列的前20项。(使用数组) 线性编程好像不用数组。我在这里贴了所有递归,线性编程,数组的方法。

#包含“stdio.h”

#包含" stdlib.h "

Void Fibonacci(int a[],int n)//循环数组

{

int I = 0;

a[0]= 1;

a[1]= 1;

for(I = 2;在;我)

{

a[I]= a[I-1]a[I-2];

}

}

Int f(int n)//递归

{

if(n==1||n==2)返回1;

返回f(n-1)f(n-2);

}

Int f2(int n)//线性规划

{

int f1=1,f2=1,sum = 0;

printf(" \ n1 \ n1 \ n ");

for(int I = 3;I = n;我)

{

sum = f1 f2

f1 = f2

f2 =总和;

printf("%d \n ",sum);

}

}

void printArray(int a[],int n)

{

int I = 0;

for(I = 0;在;我)

{

printf("-",a[I]);

}

printf(" \ n ");

}

主()

{

int a[20],n = 0;

斐波那契(a,20);

Printf("斐波那契数列如下:\ n ");

printArray(a,20);

Printf("请输入n:");

scanf("%d ",n);

printf("%d\n ",f(n));

Printf("线性规划如下:\ n ");

F2(n);

系统(“暂停”);

}

祝楼主好运!DevC平台测试通过!

c语言,算法,动态规划:有一个容量为V的盒子(正整数,0 # includestdio.h

#定义N 30

Int xiangzi(int n,int V,int a[]) //楼主后面的Vo数组必须放入递归函数或者定义为全局数组。h[n]呢??

{

int米女,t,m = V;

如果(n==0)

{

If(a[n]=V) // V是剩余空间。米女是最小的空间,一个待解变量,不可知,所以不能用Vminv来判断。

米女= V-a[n];

其他

米女= V;

}

其他

{

t =祥子(n-1,V,a);

如果(a[n]=V) //也许a[n]大于V,如果不是按照楼主的程序判断,那么此时m一定小于0,最后的米女一定会下0。这种情况要先判断排除。因此,当m定义得较早时,可以初始化m = V;

m =祥子(n-1,V-a[n],a);/*考虑该对象的选择*/

如果(tm)

米女= t;

其他

米女= m;

}

归还米女;

}

void main()

{

int V;

int n,I,m,min

int Vo[N];

Printf("盒子的容量v为");

scanf("%d ",V);

Printf("项目数:");

scanf("%d ",n);

Printf("文章量分别为:\ n ");

for(I = 0;在;我)

scanf("%d ",Vo[I]);//“%d”更改为“% d ”,并且删除了d后面的空格。不好意思,我学的C和C的语法不是很好。我刚调试好。我不知道为什么。可能是语法问题。

min =祥子(n-1,V,Vo);

printf("%d\n ",min);//还有别忘了输出。

系统(“暂停”);

}

就是这样。。。

c语言-动态编程 #包含stdio.h

#包含stdlib.h

结构树{

int值;

结构树* left

结构树*右;

};

#定义min(x,y) x y?x : y

int a[3][3] = {10,9,14,9,12,10,6,5,8 };

void add_tree_node(结构树* *节点,int x,int y,int深度)

{

//printf(" x = % d,y = %d,value = %d,depth = %d\n ",x,y,a[x][y],depth);

*node =(结构树*)malloc(sizeof(结构树));

((struct tree *)* node)-value = a[x][y]a[x][x];

if(深度== 1) {

((结构树*)*node)-left =((结构树*)* node)-right = NULL;

返回;

}否则{

add _ tree _ node((((struct tree *)* node)-left),y,(y 1)%3,depth-1);

add _ tree _ node((((struct tree *)* node)-right),y,(y ^ 2)% 3,depth-1);

}

深度-;

}

void print_tree(struct tree *t)

{

if(t == NULL)

返回;

printf("%d ",t值);

print _ tree(t-left);

print _ tree(t-right);

}

void free_tree(struct tree *t)

{

if(t == NULL)

返回;

free _ tree(t-left);

free _ tree(t-right);

免费(t);

}

int get_short_time(结构树*t)

{

if(t-left == NULL || t-right == NULL)

返回t值;

return(min(get _ short _ time(t-left),get_short_time(t-right)) t值);

}

void main()

{

结构树*根;

int i,j,minx=0,miny = 1;

for(I = 0;i3;我)

for(j = 0;j 3;j)

如果(我!= j a[minx][miny] a[i][j])

minx = i,miny = j;

Printf("最短拆卸时间是从%d套仪器到%d套仪器,时间是% d \ n ",minx1,miny1,a[minx][miny]);

//创建一个深度为5的二叉树,将5个实验所有可能的路径放入二叉树中。

add_tree_node(root,minx,miny,5);

print_tree(根);

printf(" \ n ");

Printf("完成所有实验的最短时间是:%d\n ",get _ short _ time(root));

free_tree(根);

}

相关文章

发表新评论