1.问题
设m元钱,n项投资,函数fi(x)表示将x元投入第i个项目所产生的效益(i=0,1,2,3……n)。
问:如何分配这m元钱,使得投资总效益最高?
2.解析
将这个问题分割开看,将一部分资金x元分割给第k个项目,那么剩下k-1个项目分得资金m-x元,零gk(x)表示将资金x分给前k个项目的最大利润,则求max(fk(x)+gk-1(m-x))
当k=1时:
g1(x)= f1(x),即找到这唯一的一个项目的最大利益即为所求的答案
当1<k<=n时:
k=2时运用f与g的关系递推求出每种投资额下的利益
例如
g2(5)= max(f2(x)+g1(5-x))
g2(4)= max(f2(x)+g1(4-x))
g2(3)= max(f2(x)+g1(3-x))
g2(2)= max(f2(x)+g1(2-x))
g2(1)= max(f2(x)+g1(1-x))
g2(0)= max(f2(x)+g1(0-x))
k=3时
g3(5)= max(f3(x)+g2(5-x))
g3(4)= max(f3(x)+g2(4-x))
g3(3)= max(f3(x)+g2(3-x))
g3(2)= max(f3(x)+g2(2-x))
g3(1)= max(f3(x)+g2(1-x))
g3(0)= max(f3(x)+g2(0-x))
k=4,k=5
直到推出k=n(该例题中n=5,所以k=5即结束)时的gk(m)即为所要求的最大利益。
3.设计
void insertsort(int* num,int l,int r){
插入排序 //主要用于对每组的五个数进行排序
}
int Findmid(int* num,int l,int r){
if(l==r){
return l;
}
int i,n;
for(i=l;i<r-5;i+=5){
排序并将其中位数放置于数组最前部分;
n=i-l;
}
if(r-i+1>0){
对剩余部分排序并将其中位数放到数组最前部分;
n=i-l
}
n=n/5;
if(n==1){
return l;
}
return Findmid(num,l,l+n);
}
int Partion(int* a, int l, int r, int p)
{
swap(a[p], a[l]);
int i = l;
int j = r;
int pivot = a[l];
while (i < j)
{
while (){
找到第一个比pivot小的数字的下标j;
}
a[i] = a[j];
while () {
找到第一个比pivot大的数字的下标i;
}
a[j] = a[i];
}
a[i] = pivot;
return i;
}
4.分析
时间复杂度:O(n* m* m)