问题 N: 例题 投资问题

题目描述

假设有m美元,n个产品。令fi(x)为投资x美元到产品i上的收益。


 

怎样安排投资以便总的收益f1(x1) + f2(x2) + … + fn(xn)最大?

输入

第一行2个整数,第一个数m代表投资的钱, 第二个数代表产品数n,
随后m+1行,每行有n个数,代表用mi元投资第nj个产品得到收益。

输出

最大收益

样例输入

5 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

样例输出

61

代码如下:

#include<iostream>//#include<bits/stdc++.h>
using namespace std;//标准命名空间 

int n, m;
const int MaxN = 128, MaxM = 128;
int Profit[MaxM][MaxN] = { 0 };//收益表
int dpProfit[MaxM][MaxN]={ 0 };//dp数组
int MAXPROFIT;

//将每一次得到的dp数组每一列的最大值赋值给第0列
void getMax()
{
	for (int j = 1; j <= m; j++)
	{
		for (int i = 1; i <= j; i++)
		{
			if (dpProfit[0][j] < dpProfit[i][j])
			{
				dpProfit[0][j] = dpProfit[i][j];
			}
		}
	}
}
int f()
{
	//dp数组第一行(dp[0][])就是上一次的最佳收益
	//先只考虑产品1
	for (int i = 1; i <= m; i++)
	{
		dpProfit[0][i] = Profit[i][1];
	}
	//顺序加入产品2到产品n
	for (int i = 2; i <= n; i++)
	{
		//矩阵斜边赋予产品投资额对应收益
		for (int t = 1; t <= m; t++)
		{
			dpProfit[t][t] = Profit[t][i];
		}
		for (int j = 1; j <= m; j++)
		{
			for (int k = j + 1; k <= m; k++)
			{
				dpProfit[j][k] = dpProfit[j][j] + dpProfit[0][k - j];
			}
		}
		getMax();
	}
	return dpProfit[0][m];
}

int main()
{

	cin >> m >> n;

	//输入收益表
	for (int i = 0; i <= m; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			cin >> Profit[i][j];
		}
	}

	cout<<f()<<endl;
	

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值