#include<stdio.h>
void main() {
int n, m,i,j;
int G[100][100], optq[100];
printf("Please input n and m:\n");
scanf("%d %d", &n, &m);
for (i = 0; i < n; i++)
G[i][0] = 0;
printf("Please intput the income statement:\n");
for (i = 0; i < n; i++)
for (j = 1; j <= m; j++)
scanf("%d", &G[i][j]);
printf("Show the income statement:\n");
printf("x\t");
for (i = 0; i <= m; i++)
printf("%d\t", i);
//printf("\n");
for (i = 0; i < n; i++)
{
printf("G%d(x):\t", i + 1);
for (j = 0; j <= m; j++)
printf("%d\t", G[i][j]);
//printf("\n");
}
printf("The maximum profit is:%d\n", alloc(n, m, G, optq));
for (i = 0; i < n; i++)
printf("The %d'st project is allocated %d resources.\n", i + 1, optq[i]);
}
int alloc(int n, int m, int G[][100], int optq[]) {
int optx,optg, k, i, j, s;
int q[100], d[100][100], f[100][100], g[100];
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("Show the allocated statement:\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("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 ) {
for (i = k + 1; i < n; i++)
optq[i] = 0;
for (i = k; i >= 0; i--) {
optq[i] = d[i][optx];
//printf("optx:%d\n", optx);
optx = optx - optq[i];
}
}
return optg;
}
初学dp,资源分配实现
最新推荐文章于 2025-06-09 17:52:15 发布