动态规划投资问题

//
//  opt_investment.c
//  
//
//  Created by focus on 2018/3/18.
//

#include "opt_investment.h"
#include<stdio.h>
#include<limits.h>
#define ROWS 4//投资的项目数量
#define COLS 5//投资的钱数(单位:万元)
int F[ROWS+1][COLS+1];//F[i][j]表示向前i个项目投资j万元所获得的最大收益
int x[ROWS+1][COLS+1];//x[i][j]表示投资j万元获得最大收益时项目i投资的钱的数量
//f[i][j]表示项目i投资j万元时获得的收益
int f[ROWS+1][COLS+1] = {{0,0,0,0,0,0}, {0,11,12,13,14,15}, {0,0,5,10,15,20}, {0,2,10,30,32,40}, {0,20,21,22,23,24}};


int main(){
    for(int i = 0; i <= ROWS; i++){
        F[i][0] = 0;
    }

    for(int i = 0; i <= COLS; i++){//初始化投资第1个项目
        F[1][i] = f[1][i];
        x[1][i] = i;
        printf("F[1][%d] = %d, x[1][%d] = %d\n", i, F[1][i], i, x[1][i]);

    }

    for(int i = 2; i <= ROWS; i++){//迭代计算第2个项目到最后一个项目
        for(int j = 1; j <= COLS; j++){
            F[i][j] = INT_MIN;
            int k;
            for(k = 0; k <= j; k++){//F[i][j]的最大值为该项目投入k与前i-1个项目投入j-k的和的最大值
                int temp = f[i][k] + F[i-1][j-k];
                if (temp > F[i][j]) {
                    F[i][j] = temp;
                    x[i][j] = k;//F[i][j]最大时该项目投入的钱数
                }
            }
            printf("F[%d][%d] = %d, x[%d][%d] = %d\n", i, j, F[i][j], i, j, x[i][j]);
        }
    }

    //打印最大化收益情况下每个项目的投资数量
    int sumInvest = 0;
    for(int i = ROWS; i >= 1; i--){
        int curInvest = x[i][COLS-sumInvest];
        printf("第%d个项目投资了%d万元。\n", i, curInvest);
        sumInvest += curInvest;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/androidchanhao/article/details/79602465