题目描述:Maximum Tape Utilization Ratio

Tags: 贪婪策略

设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是li ,1 < = i < = n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。在保证存储最多程序的前提下还要求磁带的利用率达到最大。 对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数和占用磁带的长度。

输入

第一行是2 个正整数,分别表示文件个数n <=600和磁带的长度L<=6000。接下来的1 行中,有n个正整数,表示程序存放在磁带上的长度。

输出

第1 行输出最多可以存储的程序数和占用磁带的长度;第2行输出存放在磁带上的每个程序的长度。

样例输入

9 50
2 3 13 8 80 20 21 22 23

样例输出

5 49
2 3 13 8 23 思路:先排序,最大可能存储程序的个数,然后DFS找到最优解。
备注:直接上来就DFS,一般般都会超时,用贪心策略才能A。
// Maximum Tape Utilization Ratio.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" //超时!!!!!
//#include <stdio.h>
//#include <string.h>
//#include <algorithm>
//#include <iostream>
//using namespace std;
//
//#define MAX 605
//int n, len, L[MAX], maxL = 0 /*存储的最大长度*/, maxS = 0/*存储的最多程序数目*/, vis[MAX], path[MAX];
//
//int cmp(int a, int b)
//{
// return a < b;
//}
//
////DFS,index为当前处理的物品编号
////sumS和sumL分别为当前总程序数和当前总长度
//void DFS(int index, int sumS, int sumL)
//{
// if (sumL > len) return;
// if (index >= n)
// { //已经完成了对n件物品的选择(死胡同)
// if (sumS > maxS || (sumS == maxS && maxL < sumL))
// {
// maxS = sumS;
// maxL = sumL;
// memcpy(path, vis, sizeof(vis));
// }
// return;
// }
// //岔道口
// vis[index]= 0 ; DFS(index + 1, sumS, sumL);//不选择第index件物品
// if ((len - sumL) >= L[index])
// vis[index] = 1; DFS(index + 1, sumS + 1, sumL + L[index]);//选择第index件物品
//}
//
//int main()
//{
// scanf("%d %d", &n, &len);
// for (int i = 0; i < n; i++) scanf("%d", &L[i]);
//
// memset(vis, 0, sizeof(vis));
// memset(path, 0, sizeof(path));
//
// sort(L, L + n,cmp);
// DFS(0, 0, 0);
//
//
// //搜索背包路径
// int ans = 0, num = 0, res[MAX];
// for (int i = 0, flag = 0; i < n; i++)
// {
// if (path[i])
// {
// ans += L[i];
// res[num++] = L[i];
// }
// }
// printf("%d %d\n", num,ans);
// for (int i = 0; i < num;i++)
// if (i != n - 1) printf("%d ", res[i]);
// else printf("%d\n", res[i]);
//
// return 0;
//} //超时解决方法:直接保存最优路径
//#include <stdio.h>
//#include <algorithm>
//#include <iostream>
//using namespace std;
//
//#define MAX 605
//int n, len, L[MAX];
//
//struct Path
//{
// int num;
// int len;
// int p[MAX];
//}maxPath;
//
//int cmp(int a, int b)
//{
// return a < b;
//}
//
////DFS,index为当前处理的物品编号
//void DFS(int index,Path cur)
//{
// if (cur.len > len) return;//长度超了
// if ((cur.num + len - index) < maxPath.num) return;//即使是装了剩下的所有程序也无法成为最优
// if (index == n)
// { //已经完成了对n件物品的选择
// if (cur.num > maxPath.num || (cur.num == maxPath.num && maxPath.len < maxPath.len))
// maxPath = cur;
// return;
// }
// DFS(index + 1, cur);//不选择第index件物品
//
// cur.p[cur.num++] = L[index];cur.len += L[index];
// DFS(index + 1, cur);
//
//}
//
//int main()
//{
// while (scanf("%d %d", &n, &len))
// {
//
// for (int i = 0; i < n; i++) scanf("%d", &L[i]);
//
// sort(L, L + n, cmp);
//
// Path p;
// p.len = 0;
// p.num = 0;
// DFS(0, p);
//
// printf("%d %d\n", maxPath.num, maxPath.len);
// for (int i = 0; i < maxPath.num; i++)
// if (i != n - 1) printf("%d ", maxPath.p[i]);
// else printf("%d\n", maxPath.p[i]);
//
// }
//
// return 0;
//}
// //WA解决办法:保存排序索引 //#include <iostream>
//#include <cstring>
//#include <algorithm>
//using namespace std;
//
//const int MAX = 605;
//int n, len, L[MAX],ind[MAX];
//
//struct Path
//{
// int num;
// int len;
// int p[MAX];
// int inx[MAX];
//
//}maxPath;
//
//void BubbleSort(int *p, int length, int * ind_diff)
//{
// for (int m = 0; m < length; m++)
// {
// ind_diff[m] = m;
// }
//
// for (int i = 0; i < length; i++)
// {
// for (int j = 0; j < length - i - 1; j++)
// {
// if (p[j] > p[j + 1])
// {
// int temp = p[j];
// p[j] = p[j + 1];
// p[j + 1] = temp;
//
// int ind_temp = ind_diff[j];
// ind_diff[j] = ind_diff[j + 1];
// ind_diff[j + 1] = ind_temp;
// }
// }
// }
//}
//
////DFS,index为当前处理的物品编号
//void DFS(int index, Path cur)
//{
// if (cur.len > len) return;//长度超了
// if (index == n)
// { //已经完成了对n件物品的选择
// if (cur.num > maxPath.num || (cur.num == maxPath.num && maxPath.len < maxPath.len))
// maxPath = cur;
// return;
// }
// DFS(index + 1, cur);//不选择第index件物品
//
// cur.p[cur.num] = L[index]; cur.len += L[index], cur.inx[cur.num++] = ind[index];
// DFS(index + 1, cur);
//
//}
//
//int cmp(int a, int b)
//{
// return a < b;
//}
//
//int main()
//{
// while (cin>>n>>len)
// {
//
// for (int i = 0; i < n; i++) cin >> L[i];
//
// int *save = new int[MAX];
// memcpy(save, L, sizeof(L));
//
// BubbleSort(L, n, ind);
//
// Path p;
// p.len = 0;
// p.num = 0;
// DFS(0, p);
//
// cout << maxPath.num << " " << maxPath.len << endl;
//
// int *inx = new int[MAX];
// memcpy(inx, maxPath.inx, sizeof(maxPath.inx));
//
// for (int i = 0; i < maxPath.num; i++)
// if (i != maxPath.num - 1) cout << inx[i] << " ";
// else cout << inx[i] << endl;
//
// sort(inx, inx + maxPath.num, cmp);
//
// for (int i = 0; i < maxPath.num; i++)
// if (i != maxPath.num - 1) cout << save[inx[i]] << " ";
// else cout << save[inx[i]] << endl;
//
// }
//
// return 0;
//} //超时解决办法:换用贪心算法
//结果还是超时。。。。。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX = ;
int n, len, L[MAX], save[MAX], mnum; struct Path
{
int num;
int len;
int p[MAX]; }maxPath; //DFS,index为当前处理的物品编号
void DFS(int index, Path cur, int remain)
{
if (cur.num == mnum)
{ //已经选择mnum件物品
if (cur.len > maxPath.len && cur.len <= len)
maxPath = cur;
return;
} if (index >= n) return; if (cur.len + remain < maxPath.len) return; //if (cur.len + L[index] > len) return;这不应该加,如果加了大于len长度的不选和选择两种DFS都没有机会了,就丧失了不选之后的DFS遍历,结果就少了。
//至少不应该加在这里 DFS(index + , cur, remain - L[index]);//不选择第index件物品 if (cur.len + L[index] <= len)
{
cur.len += L[index]; cur.p[cur.num++] = L[index];
DFS(index + , cur, remain - L[index]);
}
} int cmp(int a, int b)
{
return a < b;
} //arr,程序长度数组, r,已经使用程序的长度
int find_most(int arr[])
{
sort(arr, arr + n, cmp);
int i = , remain = len;
for (; i < n; i++)
{
remain -= arr[i];
if (remain <= ) return i;
}
return i;
}
void init(Path &a)
{
a.len = ;
a.num = ;
a.p[a.num] = { }; } int main()
{
while (cin >> n >> len)
{
int remain = ;
for (int i = ; i < n; i++)
{
cin >> L[i];
save[i] = L[i];
remain += L[i];
} //find most program number
mnum = find_most(save); Path cur;
init(cur);
init(maxPath); //init && DFS
DFS(, cur, remain); //print ans
cout << mnum << " " << maxPath.len << endl;
for (int i = ; i < maxPath.num; i++)
if (i != maxPath.num - ) cout << maxPath.p[i] << " ";
else cout << maxPath.p[i] << endl; } return ;
}

ACM-Maximum Tape Utilization Ratio的更多相关文章

  1. [swustoj 594] Maximum Tape Utilization Ratio

    Maximum Tape Utilization Ratio(0594) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 467 Ac ...

  2. Managing remote devices

    A method and apparatus for managing remote devices. In one embodiment of the present invention, ther ...

  3. Thinking Clearly about Performance

    http://queue.acm.org/detail.cfm?id=1854041 The July/August issue of acmqueue is out now acmqueue is ...

  4. Java theory and practice: Thread pools and work queues--reference

    Why thread pools? Many server applications, such as Web servers, database servers, file servers, or ...

  5. Android——内存调试

    因调试某个重大问题,怀疑到了内存,专门写了个測试脚本.记录一下. 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/37928823 一 ...

  6. Scoring and Modeling—— Underwriting and Loan Approval Process

    https://www.fdic.gov/regulations/examinations/credit_card/ch8.html Types of Scoring FICO Scores    V ...

  7. Dalvik虚拟机垃圾收集(GC)过程分析

    前面我们分析了Dalvik虚拟机堆的创建过程,以及Java对象在堆上的分配过程. 这些知识都是理解Dalvik虚拟机垃圾收集过程的基础.垃圾收集是一个复杂的过程,它要将那些不再被引用的对象进行回收.一 ...

  8. Hypervisor, computer system, and virtual processor scheduling method

    A hypervisor calculates the total number of processor cycles (the number of processor cycles of one ...

  9. Analysis of requirement specification of parking management system

    Analysis of requirement specification of parking management system PURPOSE OF THE SYSTEM The parking ...

随机推荐

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:按钮大小

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. QQ企业通知识点---ClassSerializers

    Serializers  串列器 序列化器 串行器 MemoryStream   创建其支持存储区为内存的流. BinaryFormatter   以二进制格式将对象或整个连接对象图形序列化和反序列化 ...

  3. JavaScript引用类型与对象

    1.引用类型 引用类型的值(对象)是引用类型的一个实例.引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法. 对象是某个特定引用类型的实例.新对象是使用new操作符后跟一个构造 ...

  4. AngularJS 官方启动文档

    参考:https://angular.io/guide/quickstart 中文:http://www.angularjs.net.cn/

  5. ZCGL大数据平台性能优化

    对HBase数据库建索引 参见:基于Phoenix对HBase建索引   https://www.cnblogs.com/ratels/p/11203313.html 将HBase访问微服务整合到模块 ...

  6. 4 (计算机网络) DHCP与PXE:IP是怎么来的,又是怎么没的?

    如何配置 IP 地址? 那如何配置呢?如果有相关的知识和积累,你可以用命令行自己配置一个地址.可以使用 ifconfig,也可以使用 ip addr.设置好了以后,用这两个命令,将网卡 up 一下,就 ...

  7. 安装双版本python2 和 python 3 所产生得问题 解决yum对python依赖版本问题

    错误 解决办法 一是升级yum  直接使用python3以上版本 二是修改yum的解释器为旧版本python2.7,即将连接文件   /usr/bin/python    软连接回   /usr/bi ...

  8. Linux 补丁 的简单使用: 制作补丁,打补丁,撤销补丁

    ​ 背景: 补丁的使用对于嵌入式开发人员来说,在维护或者开发中都比较方便. 制作补丁: diff - 逐行比较文件. 格式: diff 参数 旧文件/旧文件夹 新文件/新文件夹 (注意顺序 新旧文件夹 ...

  9. day02-Python运维开发基础

    1. Number 数据类型 2. 容器数据类型-字符串 """ 语法: "字符串" % (值1,值2 ... ) 占位符: %d 整型占位符 %f ...

  10. 旧iPhone遭禁,会让苹果产业链迎来新转机吗?

    过去几个月,苹果的日子并不好过,先是新iPhone定价过高导致销售疲软,股价连续下跌,万亿市值失守,被微软和亚马逊超越:手机销量上则被华为赶超,整个iPhone产业链都有点儿"哀鸿遍野&qu ...