题目描述: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. jmeter分布式linux负载机,windows主控机

    1.将参数化文件上传到linux服务器,放在linux上jmeter的bin路径下 2.设置server.rmi.ssl.disable=true 分别修改主控机和负载机的jmeter.propert ...

  2. Intent的常用属性action和category

    设置隐式跳转 首先在我们按钮监听器中添加 Intent i=new Intent(); //参数为字符串,可以添加包名.活动名 i.setAction("com.example.aaaaa. ...

  3. ubuntu18.04调整终端字体大小

    一.在终端内右键->Preferences. 二.选中Custom font,然后点击旁边的Monospace Regular 20. 三.在该界面可以选择字体类型,右下角可以调整字体大小.

  4. java并发(一):初探线程的创建

    线程的创建两种方式 创建线程有四种方式,今天主要演示的是两种:继承Thread,实现Runable接口 继承Thread创建线程 import lombok.extern.slf4j.Slf4j; @ ...

  5. flutter 启动时一直Resolving dependencies...

    原因:国内网无法从Google获取资源,貌似搭了梯子也没用 修改flutter sdk Path/packages/flutter_tools/gradle/flutter.gradle这个文件,使用 ...

  6. Lesson 4 Seeing hands

    How did vera discover she had this gift of second sight? Several cases have been reported in Russia ...

  7. js学习(三)对象与事件

    JavaScript 对象 1.JavaScript 对象:拥有属性和方法的数据. 2.在 JavaScript中,几乎所有的事物都是对象. 3.定义一个person对象 var person = { ...

  8. Health Check【转】

    强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...

  9. 使用JMX连接JVM

    什么是JMX? 什么是JMX,Java Management Extensions,即Java管理扩展,是一个为应用程序.设备.系统等植入管理功能的框架.JMX可以跨越一系列异构操作系统平台.系统体系 ...

  10. 【pwnable.kr】 [simple login]

    Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...