#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
/*
最短程序优先。求得最多可以存储的程序个数count后,再求最大利用率,问题转换为装载问题,
但count已知。
*/
const int MAX = 50;
int f[MAX];
int r = 0; //剩余程序长度和
int len; //磁带长度
int n; //程序个数
//返回最多可以存储的程序个数
int greedy()
{
int i = 0;
sort(f, f+n); //按程序程度排序
int maxLen = 0;
int count = 0;
while(i<n)
{
if(maxLen + f[i] < len)
{
maxLen += f[i++];
count++;
}
else
break;
}
return count;
}
int xm = 0; //当前已存储的程序个数
int cw = 0; //当前存储的程序总长度
int bestx[MAX]; //记录最优解
int x[MAX]; //记录被选的程序
int bestw = 0; //最优存储程序的长度
void solve(int i, int count)
{
if(i>=n)
{
if(xm == count && cw>bestw) //如果等于最多能存储的程序个数
{
bestw = cw;
for(int j=0; j<n; j++)
bestx[j] = x[j];
}
return;
}
r -= f[i];
if(cw + f[i] < len) //搜索左子树
{
xm++;
cw += f[i];
x[i] = 1;
solve(i+1, count);
x[i] = 0;
cw -= f[i];
xm--;
}
if(cw + r > bestw) //搜素右子树
{
x[i] = 0;
solve(i+1, count);
}
r += f[i];
}
int main()
{
ifstream fin("磁带利用.txt");
cout << "输入文件个数:";
fin >> n; cout << n;
cout << "\n输入磁带长度:";
fin >> len; cout << len;
cout << "\n输入各文件长度:\n";
int i;
for(i=0; i<n; i++)
{
fin >> f[i]; cout << f[i] << " ";
r += f[i];
}
int count; //最多能存储的程序个数
count = greedy();
cout << "\n最多可以存储的程序个数为:" << count;
solve(0, count);
cout << "\n占用的磁带长度为:" << bestw;
cout << "\n存放在磁带上的每个程序的长度为:\n";
for(i=0; i<n; i++)
{
if(bestx[i])
cout << f[i] << " ";
}
cout << endl;
fin.close();
return 0;
}
磁带利用率问题
最新推荐文章于 2021-12-15 00:32:01 发布