动态规划的c语言的实现

yougaocuo 2002-07-20 08:14:07
动态规划的思想我明白,但就是无法用语言实现,希望大家可以帮忙,可以举个例子向我说明,但一定要写出c程序,谢了!!
...全文
155 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeeMaRS 2002-07-21
转成C语言的版本:

/*
F(X1,X2,X3,X4) = aX1 + bX2 + cX3 + dX4
约束条件:
mX1+nX2+iX3+jX4 <= M
求:满足上述条件的F(X1,X2,X3,X4)的最大值 (a、b、c、d、m、n、i、j均为给定整数)
*/

#include <stdio.h>
#define size 4
#define MaxM 200

void main()
{
int w[size]={0},v[size]={0},pack[MaxM]={0},i,M=0,now_M;

printf("please enter a b c d m n i j M :\n");
scanf("%d %d %d %d %d %d %d %d %d",&v[0],&v[1],&v[2],&v[3],&w[0],&w[1],&w[2],&w[3],&M);

for (now_M=1;now_M<=M;now_M++)
for (i=0;i<size;i++)
if (now_M >= w[i] && pack[now_M]<pack[now_M-w[i]]+v[i])
pack[now_M]=pack[now_M-w[i]]+v[i];

printf("the max value: %d\n",pack[M]);
}
回复
LeeMaRS 2002-07-21
#include "iostream.h"
/*
F(X1,X2,X3,X4) = aX1 + bX2 + cX3 + dX4
约束条件:
mX1+nX2+iX3+jX4 <= M
求:满足上述条件的F(X1,X2,X3,X4)的最大值 (a、b、c、d、m、n、i、j均为给定整数)
*/
void main()
{
const int size=4,MaxM=200;
int w[size]={0},v[size]={0},pack[MaxM]={0},i,M=0,now_M;

cout << "please enter a b c d m n i j M:" << endl;
cin >> v[0] >> v[1] >> v[2] >> v[3] >> w[0] >> w[1] >> w[2] >> w[3] >> M;

for (now_M=1;now_M<=M;now_M++)
for (i=0;i<size;i++)
if (now_M >= w[i] && pack[now_M]<pack[now_M-w[i]]+v[i])
pack[now_M]=pack[now_M-w[i]]+v[i];

cout << "the max value:" << pack[M] << endl;
}
回复
chenggn 2002-07-20
,
回复
yougaocuo 2002-07-20
为什么未完????
回复
atlantis13579 2002-07-20
接上

/* 对于拓扑序列,运用动态规划步步算出最长路线与最短路线 */
for (i = 0; i < N; i++) {

/* 提取拓扑序列的元素 */
k = List[i];
/* 更新它所指向顶点的所有数据 */
for (j = 0; j < N; j++) {

/* 寻找指向的顶点 */
if (graph[k][j] != I) {

/* 如果新路径更短 */
if (graph[k][j] + ee[k] < ee[j]) {

/* 更新最短路径长度 */
ee[j] = graph[k][j] + ee[k];
/* 更新最短路线 */
for (l = 0; l < n_e[k]; l++) {
path_e[j][l] = path_e[k][l];
}
path_e[j][l] = j;
n_e[j] = l + 1;
}

/* 如果新路径更长 */
if (graph[k][j] + el[k] > el[j]) {

/* 更新最长路径长度 */
el[j] = graph[k][j] + el[k];
/* 更新最长路线 */
for (l = 0; l < n_l[k]; l++) {
path_l[j][l] = path_l[k][l];
}
path_l[j][l] = j;
n_l[j] = l + 1;
}
}
}
}

/* 输出结果到屏幕 */
for (i = 0; i < N; i++) {
printf("shortest(%d): %2d Path: ", i + 1, ee[i]);
for (j = 0; j < n_e[i]; j++) {
printf("%d ", path_e[i][j] + 1);
}
printf("\n");
printf("longest (%d): %2d Path: ", i + 1, el[i]);
for (j = 0; j < n_l[i]; j++) {
printf("%d ", path_l[i][j] + 1);
}
printf("\n");
}
}

int TopologicalOrder()
{
int i, j, top, count;
int indegree[N], Stack[N];

top = 0; /* 栈顶标志 */
for (i = 0; i < N; i++) {
indegree[i] = 0; /* 初始化入度 */
for (j = 0; j < N; j++) {
if (graph[j][i] != I) { /* 如连通 */
indegree[i]++; /* 入度自增1 */
}
}
if (!indegree[i]){ /* 如入度为零 */
Stack[top++] = i; /* 入栈 */
}
}
count = 0; /* 输出顶点数 */
while (top != 0) {
i = Stack[--top];
List[count++] = i;
for (j = 0; j < N; j++) {
if (graph[i][j] != I) { /* 如连通 */
if (!(--indegree[j])) { /* 而且入度为零 */
Stack[top++] = j; /* 入栈 */
}
}
}/* for */
}/* while */

return (count < N) ? 0 : 1;
}
正文完
回复
atlantis13579 2002-07-20
作者 Justin Hou

介绍
寻找最有价值路径(c语言)

描述:

从上(入口)往下行走,直到最下节点(出口)结束,将所经节点上的数值相加,要求找到一条最有价值路径(既是路径总数值最大)并输出总数值。

图:

入口   ↓
     ③
     /\
    ⑤ ④
/ \ / \
   ① ② ⑤
\ / \ /
⑨ ⑧
\ /

出口 ↓
输入文件:(abc.in)

第一行只有一个数n(1<=n<=199),且n为奇数,说明节点的层。从第二行到底n+1行为每一层中各节点的数值(在0和100之间),各个数用空格隔开,输入不要求判错。

输出文件:(abc.out)

只有一个数,为所求路径的价值数。

例子:

输入文件内容:
5
3
5 4
1 2 5
9 8
3
输出文件内容:
23

正文
/*
* File: longest.c
* Desciption: 动态规划算法计算网络的最长路线和最短路线
* Created: 2001/12/2
* Author: Justin Hou [mailto:justin_hou@hotmail.com]
*
*/
#include <stdio.h>
#define N 7 /* 顶点数目 */
#define I 999 /* 表示无穷大 */

int graph[N][N] = { /* 图的邻接矩阵 */
{I, 4, 5, 8, I, I, I},
{I, I, I, 6, 6, I, I},
{I, I, I, 5, I, 7, I},
{I, I, I, I, 8, 9, 9},
{I, I, I, I, I, I, 5},
{I, I, I, I, I, I, 4},
{I, I, I, I, I, I, I}
};
int List[N]; /* 存放拓扑序列 */

int TopologicalOrder(); /* 拓扑排序函数 */

void main() /* 主 函 数 */
{
int i, j, k, l;
int ee[N], el[N]; /* 最长最短距离 */
int path_e[N][N], path_l[N][N], n_e[N], n_l[N];
/* 记录路径数据 */

/* 初始化数据 */
for (i = 0; i < N; i++) {
n_e[i] = 0; /* 到 i 的最短路线的结点数 */
n_l[i] = 0; /* 到 i 的最长路线的结点数 */
ee[i] = I;
el[i] = 0;
}
ee[0] = el[0] = 0; /* 初始化头结点 */
path_e[0][0] = 0;
path_l[0][0] = 0;
n_e[0] = 1;
n_l[0] = 1;

/* 拓扑排序 */
if (!TopologicalOrder())
return;


未完
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告