问题描述:
有m元钱,n项投资,f[i][x]代表将x元投入到第i个项目中的收益,求最大的收益
输入:第一行为总钱数m和总项目数n;接下来为n行输入,每行m+1个,第i行第j个代表f[i][j]
分析:
我们假设一个二维函数F[i][j]代表j元钱投资前i个项目所获得的最大收益,那么F[i][j]=max{F[i-1][j-xk]+f[i][xk]}//xk取值从0到j。
所以我们就得到了动态规划的关系式。
代码如下
#include<bits/stdc++.h>
using namespace std;
int f[9][9];
int mm(int **F,int m,int n)
{
for(int i=0;i<=m;i++)//对二维数组F进行初始化
{
F[1][i]=f[1][i];
}
for(int i=2;i<=n;i++)//项目编号
{
for(int j=0;j<=m;j++)//投资数
{
F[i][j]=F[i-1][j]+f[i][0];//此时xk=0
if(j>=1)
{
for(int k=1;k<=j;k++)
{
int u=f[i][k]+F[i-1][j-k];
if(u>F[i][j])
{
F[i][j]=u;
}
}
}
}
}
return F[n][m];
}
int main()
{
int m,n;
cin>>m>>n;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
cin>>f[i][j];
}
}
int F[n+1][m+1];
int *p[n];
for(int i=0;i<=n;i++)
{
p[i]=&F[i][0];//以二维数组作为参数必须进行此变化。
}
cout<<mm(p,m,n);
return 0;
}