算法分析与设计作业7

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值