动态规划算法的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(根);
}
最后更新于 2023-10-07 22:34:44 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章