问题
设m元钱,n项投资,函数fi(x)表示将x元投入第i项项目所产生的效益,i=1,2,…,n。
问:如何分配这m元钱,使得投资的总效益最高?
解析
1、问题分析
假设分配给第i个项目的钱数是xi,问题描述为:
目标函数:max{f1(x1)+ f2(x2)+…+ fn(xn)}
约束条件:x1 +x2 +…+xn=m,xi∈N
实例:
2、问题拆解
设Fk(x)表示x万元投给前k个项目的最大效益,k=1,2,…,n, x=1,2,…,m。
设给第k个项目投资xk万元,故投资给前k-1的项目资金为(x-xk)万元
递推方程:Fk(x)=max{ fk(xk)+ Fk-1(x-xk)},k=2,3,…,n
边界条件:F1=f1(x),Fk(0)=0,k=1,2,…,n
3、问题求解
设新加第i项时,总共分配x元时,第i项分配了k元xi=k, xi(x)=k。
核心代码
for (int i = 0; i <=money; i++) {
g[i]=arr[i][1];
a[1][i]=i;
}
for (int k = 2; k <= n; k++) {
for (int i = 0; i <=money; i++) {
t[i]=arr[i][k];
a[k][i]=0;
}
for (int i = 0; i <= money; i++) {
for (int j = 0; j <=i; j++) {
if(arr[j][k]+g[i-j]>t[i]) {
t[i]=arr[j][k]+g[i-j];
a[k][i]=j;
}
}
}
for (int i = 0; i <=money; i++) {
g[i]=t[i];
}
}