// ResourceAlloc.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include <iostream>
using namespace std;
//输入:资源份额m,工程数n,各个工程对应的利润函数表p[n][m+1];
//f[n][m+1]记录前i个工程分配到不同份额资源时可获得的最大利润;数组d[n][m+1]记录f[i][x]最大时,第i个工程分配得到的资源份额;
//数组h[n]记录资源仅分配前i个工程可获得的最大利润;数组p[n]记录资源仅分配前i个工程时,第i个工程分配得到的最优资源分配份额;
//输出:最优资源分配时的最大利润bestp,最有分配时各工程分配得到的资源optq[];
template<int nn,int mm>
int ResourceAlloc(int (&p)[nn][mm])
{
int m=mm-1;
int n=nn;
int f[n+1][m+1];
int d[n+1][m+1];
for(int i=0;i<=m;i++)
{//计算前一个工程的利润函数表
f[1][i]=p[0][i];
d[1][i]=i;
}
for(int j=2;j<=n;j++)
{//计算其它f[n][m+1]记录前i个工程分配到不同份额资源时可获得的最大利润
f[j][0]=p[j-1][0]+f[j-1][0];
d[j][0]=0;
for(int t=1;t<=m;t++)
{//计算其它f[n][m+1]记录前i个工程分配到t份额资源时可获得的最大利润
f[j][t]=f[j][0];
d[j][t]=0;
for(int s=0;s<=t;s++)
{
if(f[j][t]<p[j-1][s]+f[j-1][t-s])
{
f[j][t]=p[j-1][s]+f[j-1][t-s];
d[j][t]=s;
}
}
}
}
//cout<<f[3][4]<<endl;
//计算前i(i=1,2,.....n)个工程的最大利润及最优资源分配额
int h[n+1],pp[n+1];
for(int i=1;i<=n;i++)
{
h[i]=f[i][0];
pp[i]=0;
for(int j=1;j<=m;j++)
{
if(h[i]<f[i][j])
{
h[i]=f[i][j];
pp[i]=j;
}
}
}
//cout<<h[2]<<endl;
//计算整体最大利润与最优资源分配份额
int bestp,optx,maxsub;//maxsub用于记录分配到最优解时分配的资源工程最大编号
bestp=h[1];optx=pp[1];maxsub=1;
for(int i=2;i<=n;i++)
{
if(bestp<h[i])
{
bestp=h[i];
optx=pp[i];
maxsub=i;
}
}
int k=maxsub;//分配得到的资源工程最大编号,最大编号后的工程不分配资源
int optq[n+1];
for(int i=k+1;i<=n;i++)
{
optq[i]=0;
}
for(int i=k;i>=1;i--)
{
optq[i]=d[i][optx];
optx=optx-optq[i];
}
return (bestp);
}
int main(int argc, char* argv[])
{
int a[3][5]={{0,41,48,60,66},{0,42,50,60,66},{0,64,68,78,78}};
int bestp=ResourceAlloc(a);
cout<<"最优解"<<bestp<<endl;
return 0;
}