1.问题
设m元钱,n项投资,函数fi(x)表示将x元投入第i项项目所产生的效益,i=1,2,…,n。
问:如何分配这m元钱,使得投资的总效益最高?
2.解析
用动态规划的方法来对问题进行解决
设Fk[x]表示x万元投给前k个项目的最大效益,k=1,2,…,n,x=1,2,…,m
递推方程:F[k][x]=max{f[k][j]+F[k-1][x-j]} ,
边界条件:F[1][x]=f[1][x] , F[k][0]=0 ,
说明:第k步,共分配x万元
其中分配给第k个项目为x万元;
x-xk万元分配给前k-1的项目为。
3.设计
for(int i=1;i<=n;++i){ //第i个项目
for(int j=0;j<=m;++j) {//i个项目共分配j万元
for(int k=0;k<=j;++k){ //第k个项目分配xk
if(invest [i-1][j-k]+single_invest[i][k]>invest [i][j]){
invest [i][j]=invest [i-1][j-k]+single_invest[i][k];
allot[i][j]=k;
}
}
}
}
4.分析
5.源码
#include<stdio.h>
#define max 100
#define max2 100
int invest [100][100];
int single_invest[100][100];
int allot[100][100];
int main(){
single_invest[0][0]=0;
single_invest[0][1]=0;
single_invest[0][2]=0;
single_invest[0][3]=0;
single_invest[1][0]=11;
single_invest[1][1]=0;
single_invest[1][2]=2;
single_invest[1][3]=20;
single_invest[2][0]=12;
single_invest[2][1]=5;
single_invest[2][2]=10;
single_invest[2][3]=21;
int n=4, m=2;
for(int i=1;i<=n;++i){
for(int j=0;j<=m;++j){
for(int k=0;k<=j;++k){
if(invest [i-1][j-k]+single_invest[i][k]>invest [i][j]){
invest [i][j]=invest [i-1][j-k]+single_invest[i][k];
allot[i][j]=k;
}
}
}
}
printf("The maximum benefit is:%d\n",invest [n][m]);
}