概要
动态规划的决策不是线性的而是全面考虑到各种不同情况分别进行决策,最后通过多阶段决策逐步找出问题最优解。而当前决策也会依赖于上一阶段的决策,此时便会发生状态的转移。动态规划算法可以说是一种“聪明的蛮力法”,因为动态规划是会考虑到每一种可能,而聪明的地方是相对于蛮力法,它去掉了很多没必要的运算。
例1、资源分配问题
现有7万元需要投资到A,B,C三个项目,利润表如下图。求总利润分配最大的资源分配方案
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
A | 0.11 | 0.13 | 0.15 | 0.21 | 0.24 | 0.30 | 0.35 |
B | 0.12 | 0.16 | 0.21 | 0.23 | 0.25 | 0.24 | 0.34 |
C | 0.08 | 0.12 | 0.20 | 0.24 | 0.26 | 0.30 | 0.35 |
#include <iostream>
using namespace std;
int main(){
double invest[3][8]={//投资表,记录了A,B,C三个投资的利润率信息,预留多一个位置,invest[i][j]中i表示项目,j表示金额
{0,0.11,0.13,0.15,0.21,0.24,0.30,0.36},
{0,0.12,0.16,0.21,0.23,0.25,0.24,0.34},
{0,0.08,0.12,0.20,0.24,0.26,0.30,0.35}
};
double max[8],temp[8]={0},gain[8]={0};//max记录的是优策略下的投资利润率,gain记录的是当前投资金额可得的最大利润
//temp记录的是上一次决策中可以获得的最大利润
for(int i=0;i<8;i++){//初始化,当只有A投资可选时,最优投资策略便是全部投资A
max[i]=invest[0][i];
}
for(int i=0;i<8;i++){//初始化,当只有A投资可选时,可以得到的最大利润
gain[i]=invest[0][i]*i;
}
for(int i=1;i<3;i++){//控制投资项目
for(int j=1;j<8;j++){//控制投资金额,j即为当前的投资金额
for(int k=0;k<j;k++){//k表示投资给上一个最优决策的金额, j-k表示把剩余的资金投资给新添加的那个项目
temp[j]=max[k]*k+invest[i][j-k]*(j-k);
if(gain[j]<temp[j]){
gain[j]=temp[j];
max[j]=gain[j]/j;
}
}
}
}
//输出
cout<<"最大投资利润率为:";
for(int i=1;i<8;i++){
cout<<max[i]<<" ";
}
cout<<endl<<"最大利润为:";
for(int i=1;i<8;i++){
cout<<gain[i]<<" ";
}
}