#include <iostream>
using namespace std;
//投资问题
#define MAX 10000
int func(int i, int x) //假设的收益表,假设由 5万元,投资4个项目
{
//收益的函数,表示第i个项目投入x元钱,所获得的收益,函数的返回值为收益
int EarLst[6][4] = {
{0,0,0,0},
{11,0,2,20},
{12,5,10,21},
{13,10,30,22},
{14,15,32,23},
{15,20,40,24}
};
int earning;
earning = EarLst[x][i-1];
return earning;
}
// x 元钱,n个项目
int flag[MAX] = {0}; //flag的填充从1开始
int invest(int x, int n) // x元钱,投给n个项目
{
int Earning = 0;
int maxEarning = -0x3f3f3f3;
if(n==1)
{
flag[n] = x;
return func(1,x); //第1个项目,投入n元钱
}
else
{
int i;
for(i=0;i<=x;i++)
{
Earning = func(n,i)+invest(x-i,n-1); //func(n,k) 表示第n个项目投入k元
if(Earning > maxEarning)
{
maxEarning = Earning;
flag[n] = i;
}
}
return maxEarning;
}
}
//对flag进行反向追溯,获取最优解
void displayRes(int n)
{
int i ;
for(i=1;i<=n;i++)
{
printf("第%d个项目,投资%d\n",i,flag[i]);
}
}
int main()
{
int x,n;
int resEarning = 0;
cin>>x>>n;
resEarning = invest(x,n);
printf("%d\n",resEarning);
displayRes(n);
return 0;
}
投资问题
最新推荐文章于 2022-10-19 15:47:06 发布