1.多段图的最小成本问题
#include<iostream>
using namespace std;
#define LEN sizeof(struct NODE)
#define N 20
#define MAX_TYPE 10000
#define ZERO_TYPE 0
struct NODE
{
int v_num;
int len;
struct NODE *next;
};
NODE *node = new NODE[N];
int cost[N];
int *route = new int[N];
int path[N];
int fgragh(int n)
{
int i;
struct NODE *pnode;
int *path = new int[n];
int min_cost, *cost = new int[n];
// 初始化
for (i = 0; i < n; i++)
{
cost[i] = MAX_TYPE;
path[i] = -1;
route[i] = 0;
}
cost[n - 1] = ZERO_TYPE;
// 分段决策
for (i = n - 2; i >= 0; i--)
{
pnode = node[i].next;
while (pnode != NULL) {
if (pnode->len + cost[pnode->v_num] < cost[i])
{
cost[i] = pnode->len + cost[pnode->v_num];
path[i] = pnode->v_num;
}
pnode = pnode->next;
}
}
// 进行全局的最优决策
i = 0;
while ((route[i] != n - 1) && (path[i] != -1))
{
i++;
route[i] = path[route[i - 1]];
}
min_cost = cost[0];
cout << "最短路径为:";
for (int j = 0; j <= i; j++)
cout << route[j] << " ";
printf("\n");
delete path;
delete cost;
return min_cost;
}
int main()
{
int m, t, i, l, u, v, distant;
cout << "输入顶点数和边数:" << endl;
cin >> m;//顶点数
cin >> t;//边数
cout << "初始化邻接链表:" << endl;
for (i = 0; i < m; i++)
node[i].next = NULL;
struct NODE *p;
for (i = 0; i < t; i++)
{
cin >> u >> v >> l;
p = new NODE;
p->v_num = v;
p->len = l;
p->next = node[u].next;
node[u].next = p;
}
distant = fgragh(m);
cout << "最小成本为:"<<distant<<endl;
system("pause");
}
- 资源分配问题
#include <stdio.h>
#include <stdlib.h>
#define N 100
int alloc(int n, int m, int G[N][N], int optq[N]) {
int optx, optg, k, i, j, s;
int q[N];
int d[N][N];
int f[N][N];
int g[N];
for (i = 0; i <= m; i++) {
f[0][i] = G[0][i];
d[0][i] = i;
}
for (i = 1; i < n; i++) {
f[i][0] = G[i][0] + f[i - 1][0];
d[i][0] = 0;
for (j = 1; j <= m; j++) {
f[i][j] = f[i][0];
d[i][j] = 0;
for (s = 0; s <= j; s++) {
if (f[i][j] < G[i][s] + f[i - 1][j - s]) {
f[i][j] = G[i][s] + f[i - 1][j - s];
d[i][j] = s;
}
}
}
}
printf("分配的份额:\n");
printf("x\t");
for (i = 0; i <= m; i++)
printf("%d\t", i);
printf("\n");
for (i = 0; i < n; i++) {
printf("f%d(x):\t", i + 1);
for (j = 0; j <= m; j++)
printf("%d\t", f[i][j]);
printf("\n");
printf("d%d(x):\t", i + 1);
for (j = 0; j <= m; j++)
printf("%d\t", d[i][j]);
printf("\n");
}
for (i = 0; i < n; i++) {
g[i] = f[i][0];
q[i] = 0;
for (j = 1; j <= m; j++) {
if (g[i] < f[i][j]) {
g[i] = f[i][j];
q[i] = j;
}
}
}
optg = g[0];
optx = q[0];
k = 0;
for (i = 1; i < n; i++) {
if (optg < g[i]) {
optg = g[i];
optx = q[i];
k = i;}}
if (k < n - 1)
for (i = k + 1; i < n; i++)
optq[i] = 0;
for (i = k; i >= 0; i--) {
optq[i] = d[i][optx];
optx -= optq[i];}
return optg;}
int main() {
int n, m, i, j;
int G[N][N];
int optq[N];
printf("请输入工程数目和工程份额:\n");
scanf("%d,%d", &n, &m);
printf("请输入各份额资源分配给各工程所获得的利润:\n");
for (i = 0; i < n; i++) {
printf("工程%d:\n", i + 1);
for (j = 0; j <= m; j++)
scanf("%d", &G[i][j]);}
printf("最大利润是:%d\n", alloc(n, m, G, optq));
for (i = 0; i < n; i++)
printf("分配给第%d个工程的最优份额为:%d\n", i + 1, optq[i]);
system("pause");
return 0;
}