投资问题编程实现

 设国家拨给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();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值