1、问题描述
设有资源a,分配给n个项目,gi(x)为第i个项目分得资源x所得到的利润。求总利润最大的资源分配方案,也就是解下列问题:
max z=g1(x1)+ g2(x2)+……gn(xn)
x1+xx2+x3+……xn=a, xi≥0,i=1,2,3,……,n
函数gi(x)以数据表的形式给出.例如:现有7万元投资到A,B,C 三个项目,利润见表,求问题总利润最大的资源分配方案。
2、问题分析
1)阶段划分及决策
比较直观的阶段划分就是逐步考虑每一个项目在不同投资额下的利润情况。
2)数据结构设计:
(1) 开辟一维数组q来存储原始数据。
(2) 另开辟一维数组f存储当前最大收益情况。
(3) 开辟记录中间结果的一维数组数组temp,记录正在计算的最大收益。
(4) 开辟二维数组a。
(5) 数组gain存储第i个工程投资数的最后结果。
3、java实现
package 动态规划;
import java.util.Scanner;
public class 资源分配 {
public static void main(String[] args) {
int array[][] = new int[100][100];
float item[] = new float[100];
float get[] = new float[100];
float temp[] = new float[100];
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
for (int i = 0; i <= n; i++) {
item[i] = sc.nextFloat();
get[i] = item[i];
array[1][i] = i;
}
for (int i = 2; i <= m; i++) {
for (int j = 0; j <= n; j++) {
item[j] = sc.nextFloat();
temp[j] = item[j];
}
for (int k = 0; k <= n; k++) {
for (int l = 0; l <= k; l++) {
if(get[k-l] + item[l] > temp[k]) {
temp[k] = get[k-l] + item[l];
array[i][k] = l;
}
}
}
for (int p = 0; p <= n; p++) {
get[p] = temp[p];
}
}
int rest = n;
int gain[] = new int[100];
for (int i = m; i <= 1; i--) {
gain[i] = array[i][rest];
rest = rest - gain[i];
}
for (int j =1; j <= m; j++) {
System.out.print(gain[j]+" ");
}
System.out.println(get[n]);
sc.close();
}
}