4-17 磁带最大利用率问题
问题描述
设有 n 个程序1,2,...,n1,2,...,n要存放在长度为 L 的磁带上。程序 i 存放在磁带上的长度是lili ,1≤i≤n1≤i≤n。
程序存储问题要求确定这 n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。在保证存储最多程序的前提下还要求磁带的利用率达到最大。
对于给定的 n 个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数和占 用磁带的长度。
数据输入:
第一行是 2 个正整数,分别表示文件个数 n 和磁带的长 度 L。接下来的 1 行中,有 n 个正整数,表示程序存放在磁带上的长度。
Java
import java.util.Arrays;
import java.util.Scanner;
public class CiDaiZuiDaLiYongLv {
private static int n, tapeLen;
private static int[] len;
private static int MAX = 10000;
private static int xm;
private static int cw;
private static int[] bestx;
private static int[] x;
private static int bestw;
private static int r;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (true) {
xm = 0;
cw = 0;
bestw = 0;
r = 0;
bestx = new int[MAX];
x = new int[MAX];
n = input.nextInt();
tapeLen = input.nextInt();
len = new int[n];
for (int i = 0; i < n; i++) {
len[i] = input.nextInt();
r += len[i];
}
Arrays.sort(len);
int count = greedy();
System.out.println("Max programs: " + count);
maxLoading(0, count);
System.out.println("Occupied tape length: " + bestw);
for (int i = 0; i < n; i++) {
if (bestx[i] > 0)
System.out.print(len[i] + " ");
}
}
}
private static void maxLoading(int i, int count) {
if (i >= n) {
if (xm == count) { //如果等于最多能存储的程序个数
for (int j = 0; j < n; j++)
bestx[j] = x[j];
bestw = cw;
}
return;
}
r -= len[i];
if (cw + len[i] <= tapeLen && xm < count) { //搜索左子树
xm++;
cw += len[i];
x[i] = 1;
maxLoading(i + 1, count);
cw -= len[i];
xm--;
}
if (cw + r > bestw) { //搜素右子树
x[i] = 0;
maxLoading(i + 1, count);
}
r += len[i];
}
//最短程序优先
private static int greedy() {
int sum = 0;
int count = 0;
for (int i = 0; i < n; i++) {
sum += len[i];
if (sum <= tapeLen)
count++;
else
break;
}
return count;
}
}
Input & Output
9 50
2 3 13 8 80 20 21 22 23
Max programs: 5
Occupied tape length: 49
2 3 8 13 23
王晓东《计算机算法设计与分析》(第3版)P134

本文探讨了如何使用贪心算法解决磁带最大利用率问题,旨在确定最佳存储方案,使得在有限长度的磁带上能存放尽可能多且利用率最高的程序。详细介绍了问题背景及Java代码实现,包括数据输入和输出的格式。
2903





