题目描述
假设有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;
}