您的位置:首页 > 其它

资源分配问题

2016-04-25 11:44 267 查看
设有资源n(n为整数),分配给m个项目,gi(x)为第i个项目分得资源x(x为整数)所得的利润。求总利润最大的资源分配方案,也就是解下列问题:

max z = g1(x1)+g2(x2)+……+gm(xm)

x1+x2+……+xm = n, xi为整数,i=1,2,3,……,m

函数gi(x)以数据表的形式给出。



C++代码:

#include <iostream>
#define N 100
using namespace std;
//a[.][.][0]存储原始数据
//a[.][.][1]存储存储动态规划过程
//a[.][.][2]存储最优化路径
int main()
{
//a[i][j]=k;表示前i个工程投资j所获得最大利润时给第i个工程分配的资源数
int a

;
//gain记录第i个工程分配的资源数
int gain
;
//f[i]表示当前投资总投资i时获得的最大利润
double f
;
//pre_f[i]表示上一个项目投资总投资i时获得的最大利润
double pre_f
;
//q[i]记录某个工程的利润表
double q
;
cout<<"输入工程数:";
int m;
cin>>m;

cout<<"输入总资源数:";
int n;
cin>>n;
cout<<"输入第1个工程获得的利润表:"<<endl;
for (int i=0;i<=n;++i)
{
cin >> q[i];
f[i] = q[i];
pre_f[i] = q[i];
a[1][i] = i;
}
cout<<endl;

for (int k=2;k<=m;++k)
{
cout<<"输入第"<<k<<"个工程获得的利润表:"<<endl;
for (int i=0;i<=n;++i)
{
cin >> q[i];
f[i] = 0;
a[k][i] = 0;
}
for (int i=0;i<=n;++i)  //i为总投资数
{
cout<<"资源数为"<<i<<"时"<<endl;
for (int j=0;j<=i;++j)//j为给第k个工程的投资数
{
if (q[j] + pre_f[i-j] > f[i])
{
a[k][i] = j;
f[i] = q[j] + pre_f[i-j];
a[k][i] = j;
}
cout<<q[j] + pre_f[i-j]<<' ';
}
cout<<endl;
}
cout<<"当前最大利润表如下:"<<endl;
for (int i=0;i<=n;++i)
{
pre_f[i] = f[i];
cout<<"f["<<i<<"]:"<<f[i]<<' ';
}
cout<<endl<<endl;
}
/*for (int i=1;i<=m;++i)
{
for (int j=1;j<=n;++j)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;*/
int rest = n;
for (int i=m;i>=1;--i)
{
gain[i] = a[i][rest];
rest = rest-gain[i];
}
for (int i=1;i<=m;++i)
{
cout<<"第"<<i<<"个项目投资"<<gain[i]<<endl;
}
cout<<"总利润:"<<f
<<endl;
return 0;
}

// 3 7
// 0 0.11 0.13 0.15 0.21 0.24 0.30 0.35
// 0 0.12 0.16 0.21 0.23 0.25 0.24 0.34
// 0 0.08 0.12 0.20 0.24 0.26 0.30 0.35

// 0 0.11 0.13 0.15 0.21 0.24 0.30 0.35 0 0.12 0.16 0.21 0.23 0.25 0.24 0.34 0 0.08 0.12 0.20 0.24 0.26 0.30 0.35


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: