The-Design-and-Analysis-of-Algorithms 作业7

1. 问题

m元钱,n项投资,fi(x):将x元投入第i个项目的效益.求使得总效益最大的投资方案.

2. 解析

建模:
问题的解是向量<x1,x2,…,xn>,xi是投给项目i的钱数,i=1,2,…,n.
目标函数 max{f1(x1)+f2(x2)+…+fn(xn)}
约束条件 x1+x2+…+xn=m,xi∈N

实例:5万元钱,4个项目.效益函数如下表所示:
在这里插入图片描述

子问题界定:有参数k和x界定. k:考虑对项目1,2,…,k投资 x:投资总钱数不超过x
原始输入:k=n,x=m
子问题计算顺序:k=1,2,…,n 对于给定的k,x=1,2,…,m
优化函数的递推方程: Fk(x):x元钱投给前k个项目最大效益多步判断:若知道p元钱(p≤x)投给前k-1个项目的最大效益Fk-1§,确定x元钱投给前k个项目的方案
递推方程和边界条件:
在这里插入图片描述

k=1时
在这里插入图片描述

F1(1)=11,F1(2)=12,F1(3)=13,F1(4)=14,F1(5)=15

k=2时
在这里插入图片描述

方案:(1,0), (0,1)
F2(1)=max{ f1(1),f2(1)}=11
方案: (2,0), (1,1), (0,2)
F2(2)=max{ f2(2),F1(1)+f2(1),F1(2)}=12
方案:(3,0), (2,1), (1,2), (0,3)
F2(3)=max{ f2(3),F1(1)+f2(2),F1(2)+f2(1),F1(3)}=16

同理可计算出:F2(4)=21,F2(5)=26

在这里插入图片描述

解:x1=1,x2=0,x3=3,x4=1,F4(5)=61

3. 设计

//核心代码
for (int i=1;i<=number;i++)
{
for (int j=0;j<=money;j++)
{
dp[i][j]=0;
for (int k=0;k<=j;k++)
{
if (dp[i][j]<f[i][k]+dp[i-1][j-k])
dp[i][j]=f[i][k]+dp[i-1][j-k];
}
}
}

4. 分析

在这里插入图片描述

5. 源码

https://github.com/LiChunning/The-Design-and-Analysis-of-Algorithms/blob/main/%E6%8A%95%E8%B5%84%E9%97%AE%E9%A2%98.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值