您的位置:首页 > 其它

资源分配问题(动态规划)

2013-11-29 14:17 274 查看
//问题描述:资源分配问题  
//某厂根据计划安排,拟将n台相同的设备分配给m个车间,各车间获得这种设备后,可以为国家提供盈利Ci j(i台设备提供给j号车间将得到的利润,1≤i≤n,1≤j≤m) 。
//问如何分配,才使国家得到最大的盈利?其中Cij为(0,1000)的随机数。要求输出10个实例

#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<iomanip.h>
#define N 30//设备数量
#define M 10//车间数量
#define T 5//实例个数,题目要求10个,但是控制台最大只能同时显示5个,因此这里设置为5
int main(){
//
int t=T;
while(t--){
//////////////////////////////////声明变量以及初始化
cout<<"第"<<T-t<<"个实例:"<<endl;
srand((unsigned int)time(0));
//数组c存放i台机器分配给j号车间可获得的利润
//数组v存放i台机器分配给前j个车间可获得的最大的利润
//数组d存放分配给前j个车间的分配数
int C[N+1][M+1],V[N+1][M+1],D[N+1][M+1];
//初始化数组
memset(C,0,sizeof(int));
memset(V,0,sizeof(int));
memset(D,0,sizeof(int));
int i=0,j=0,k=0;
////////////////////////////这段代码随机产生并输出C[i][j];
cout<<"i台机器分配给j号车间可获得的利润:"<<endl;
for(i=0;i<=M;i++){
cout<<setw(4)<<i;
}
cout<<endl;
for(i=1;i<=N;i++){
cout<<setw(4)<<i;
for(j=1;j<=M;j++){
C[i][j]=rand()%1000;
cout<<setw(4)<<C[i][j];
}
cout<<endl;
}
////////////////////////////////////////////////////////
//////这段代码顺推算出每增加第j号车间其前j-1个车间所分配的设备数D[i][j];
//////以及算出i台设备分配到j个车间的最大利润V[i][j];
for(i=1;i<=N;i++){
for(j=1;j<=M;j++){
for(k=0;k<=i;k++){
if(V[i][j]<V[k][j-1]+C[i-k][j]){
V[i][j]=V[k][j-1]+C[i-k][j];
D[i][j]=k;
}
}
}
}
cout<<"最大利润为:"<<V
[M]<<endl;
///////////////////////////////////////////////////////////////
//从最后一个车间分配的设备数量(N-D[i][j])逆推到第一号车间分配的设备数量。
k=N;
for(j=M;j>=1;j--){
cout<<"第"<<j<<"号车间分配了"<<k-D[k][j]<<"台设备。"<<endl;
k=D[k][j];
}
}
return 0;
}




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