设国家拨给60w元投资,供四个工厂扩建使用,每个工厂扩建后的利润与投资额的大小有关,投资后的利润函数如下表所示。
求总投资60w时的最大利润是多少? 60w资产如何分配给这4个工厂?
编程解决如下:
public class FactoryFund {
public static int N = 5; //表示4个工厂,0位置不用
public static int Sum = 60;//表示总钱数
public static int M = Sum / 10 + 1;
static int tb[][] = {
{0, 20, 50, 65, 80, 85, 85},
{0, 20, 40, 50, 55, 60, 65},
{0, 25, 60, 85, 100, 110, 115},
{0, 25, 40, 50, 60, 65, 70}
};
static int getMaxValue() {
int[][] dp = new int[N][];
int path[][] = new int[N][];//记录投资给自己多少
for (int i = 1; i < N; i++) { //i代表第几个工厂 从1开始编号
dp[i] = new int[M];
path[i] = new int[M];
for (int j = 0; j <= Sum; j = j + 10) { //代表投资的钱数
int ind = j / 10;
if (i == 1) {
dp[i][ind] = tb[0][ind];
path[i][ind] = tb[0][ind];
} else {
dp[i][ind] = 0;
}
}
}
for (int i = 2; i < N; i++) { //表示4个工厂
for (int j = 10; j <= Sum; j = j + 10) { //代表投资的钱数
int maxValue = 0;
int indJ = j / 10;
int maxInd = -1;
for (int k = 0; k <= j; k = k + 10) {
int indK = k / 10;
int value = dp[i - 1][indJ - indK] + tb[i - 1][indK];
if (value > maxValue) {
maxValue = value;
maxInd = k;
}
}
dp[i][indJ] = maxValue;
path[i][indJ] = maxInd;
}
}
System.out.println("max sum " + dp[N - 1][M - 1]);
traceBack(path, N - 1, Sum);
return dp[N - 1][M - 1];
}
static void traceBack(int[][] path, int n, int sum) {
if (n == 1) { //第一个工厂,直接打印
System.out.println(sum);
return;
}
int indS = sum / 10;
traceBack(path, n - 1, sum - path[n][indS]);
System.out.println(path[n][indS]);
}
public static void main(String[] args) {
getMaxValue();
}
}