多个公司间的机器分配问题(c++)

总公司拥有高效生产设备M台,准备分给下属的N个公司。各分公司若获得这些设备,可以为国家提供一定的盈利。

  问:

  如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M<=15,N<=10。分配原则:每个公司有权获得任意数目的设备,但总台数不得超过总设备数M。

  数据文件格式为:第一行保存两个数,第一个数是设备台数M,第二个数是分公司数N。接下来是一个M*N的矩阵,表明了第I个公司分配J台机器的盈利。

  

  如令M=8,N=4

  矩阵为

13577101111
224568912
1446881215
345678911

       

 用P(i,j)表示 j台设备分配给前(如果把这个“前”字去掉下面状态转移方程就很难理解了)i个子公司的盈利最大的情形,上述的矩阵为table[M+1][N+1],为描述和编码方便,从[1][1]开始存值

  用分配出去的机器数表示状态   

    转移方程为:

    P[i,j]=max(P[i-1,j-k]+table[i][k])  

    初始状态为:

    P[i,0]=0

    p[0,j]=0

#include<bits/stdc++.h>
using namespace std;
int f[2505][2505],a[2505][2505],m,n;
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin>>a[i][j];
	memset(f,-1,sizeof(f));
	for(int i=0; i<=n; i++) f[i][0]=0;
	for(int i=0; i<=n; i++) for(int j=0; j<=m; j++) if(f[i][j]!= -1) for(int k=0; k<=m-j; k++) if(j+k<=m&&i+1<=n) f[i+1][j+k]=max(f[i+1][j+k],f[i][j]+a[i+1][k]);
	cout<<f[n][m];
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多机调度问题是一个经典的优化问题,其目标是将一组任务分配给多台机器,使得任务的完成时最小化。贪心算法是解决多机调度问题的一种常用方法。 在贪心算法中,我们通过每次选择当前最优的任务来构建解决方案。对于多机调度问题,可以按照以下步骤进行贪心算法的设计: 1. 将任务按照其执行时从大到小进行排序。 2. 创建一个长度为机器数量的数组,用于记录每台机器的当前任务执行时。 3. 遍历排序后的任务列表,将每个任务分配给当前执行时最小的机器,并更新该机器的执行时。 4. 返回所有机器中执行时最长的值作为最终的完成时。 以下是一个使用C++实现的多机调度问题的贪心算法示例: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int greedyMultiMachineScheduling(vector<int>& tasks, int numMachines) { sort(tasks.rbegin(), tasks.rend()); // 按照执行时从大到小排序 vector<int> machineTimes(numMachines, 0); // 记录每台机器的当前任务执行时 for (int task : tasks) { int minTime = machineTimes; int minIndex = 0; // 找到当前执行时最小的机器 for (int i = 1; i < numMachines; i++) { if (machineTimes[i] < minTime) { minTime = machineTimes[i]; minIndex = i; } } // 将任务分配给当前执行时最小的机器,并更新执行时 machineTimes[minIndex] += task; } // 返回所有机器中执行时最长的值作为最终的完成时 return *max_element(machineTimes.begin(), machineTimes.end()); } int main() { vector<int> tasks = {3, 2, 4, 1, 5}; int numMachines = 3; int completionTime = greedyMultiMachineScheduling(tasks, numMachines); cout << "完成时:" << completionTime << endl; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值