贪心算法?我全都要!——算法第四章上机实践报告

算法第四章上机实践报告

一、        实践题目

4-1 程序存储问题 (90 )

设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。

输入格式:

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

输出格式:

输出最多可以存储的程序数。

输入样例:

在这里给出一组输入。例如:

6 50

2 3 13 8 80 20

输出样例:

在这里给出相应的输出。例如:

5

二、        问题描述

先输入程序个数和磁带长度,下一行依次输入每个程序的长度,从而选择一种储存方式使得储存的程序个数最多(选择的程序总长不能超过磁带长度)。

要尽可能多的储存程序,那么只需要每次都挑最短的加入进磁带即可,用到贪心算法的思维,可描述为:

式中,变量xi=0表示第i个程序不装入磁带,xi=1表示第i个程序装入磁带,L是磁带总长,li是第i个程序的长度。

三、        算法描述

1、贪心算法

    sort(a,a+n);
    int p = 0, count = 0;
    for(int i = 0; i < n; i++) {
        count += a[i];
        if(count <= m) {
            p++;
        }
    }

策略:每次都选择长度最小的加入(用sort直接按从小到大排好序)

证明:

设程序长度按从小到大排序,(x1,x2,…,xn)是一个最优解,设k = min { i | xi = 1 }(1≤i≤n),如果该问题有解,则1≤k≤n。

①    当k=1时,(x1,x2,…,xn)是一个满足贪心选择性质的最优解。

②    当k>1时,取y1=1,yk=0,yi=xi,1<i≤n,i≠k,则

因此,(y1,y2,…,yn)是所给问题的可行解。

另一方面,由知,(y1,y2,…,yn)是满足贪心选择性质的最优解。

最优子结构:

设(x1,x2,…,xn)是该问题的满足贪心选择性质的最优解,则x1=1,(x2,x3,…,xn)是磁带可用长度为L-l1、待选择程序为{2,3,…,n}时相应最优装载问题的最优解。也就是说,该问题具有最优子结构性质。

2、判断是否超过总长度

将从小到大的排好序的程序依次加入磁带,如果超出总长度就停止。用一个变量count来记录已用长度,用p来记录加入的程序数。

3、完整代码

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main(){
 5     int n,m;
 6     cin>>n>>m;
 7     int a[n];
 8     for(int i = 0; i < n; i++) {
 9         cin>>a[i];
10     }
11     sort(a,a+n);
12     int p = 0, count = 0;
13     for(int i = 0; i < n; i++) {
14         count += a[i];
15         if(count <= m) {
16             p++;
17         }
18     }
19     cout<<p<<endl;
20     return 0;
21 } 

完整代码

算法时间及空间复杂度分析

sort排序+循环遍历所有程序,不断加入磁带直到达到最大长度限制,所以时间复杂度为O(n),这里贪心算法只是一个sort排序,贪心算法的时间复杂度为O(nlogn)。

解这道题中,只用到了存储数据的本来的数组a[n],将本来的数组进行排序,没有用到辅助空间。

四、        心得体会

贪心问题,做起来我自己感觉,比起前面的动态规划,分治问题都要简单许多。就是在寻找一个贪心策略,举出反例的话就换一个,最后得到最好的,一般都是“最什么什么的”策略,很好想,也较好打出代码。

原文地址:https://www.cnblogs.com/990924991101ywg/p/11876844.html

时间: 2024-11-05 11:23:34

贪心算法?我全都要!——算法第四章上机实践报告的相关文章

算法第四章上机实践报告

一.实践题目:删数问题 二.问题描述: 给定一个n位的正整数a,去掉其中任意k(k≤n) 个数字后,剩下的数字按照原次序排列成一个的新的正整数.在给定的n位正整数a和正整数k的情况下,输出完成该操作后剩下的正整数. 三.算法描述: 正整数的位数不定,用long long去存不一定存的下,所以用一个字符数组str[]来存储.此处运用一种贪心策略,不停的对这个整数进行扫描,当发现当前位的后一位比当前位小的情况,将当前位删除(例如1873,删除8肯定比删除7更优),若所有位数的数字按照升序排列,则删除

第四章上机实践报告

一:实践题目: 删数问题 (110 分) 给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数.对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案. 输入格式: 第 1 行是1 个正整数 a.第 2 行是正整数k. 输出格式: 输出最小数. 输入样例: 在这里给出一组输入.例如: 178543 4 输出样例: 在这里给出相应的输出.例如: 13 二:问题描述: 使用贪心算法的思想每次选择从头开始递增的数字中最大的数字 即一

揭露动态规划真面目——算法第三章上机实践报告

算法第三章上机实践报告 一.        实践题目 7-2 最大子段和 (40 分) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5

09.19算法第二章上机实践报告

算法第二章上机实践报告 https://edu.cnblogs.com/campus/gdwywm/se1803/homework/7608 1.实践题目 7-3 两个有序序列的中位数 https://pintia.cn/problem-sets/1173827583729741824/problems/1173827629514764290 2.问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A ?0 ?? ,A ?1 ?? ,?,A ?N−1 ?

算法第四章上机实验报告

题目:删数问题 问题描述:输入一个正整数a和一个正整数k(k≤n ),在n位正整数a中去掉其中任意k个数字后,剩下的数字按原次序排列组成一个新 的正整数. 算法描述:从前往后进行比较,删掉升序的最后那个数,若一直保持升序,则删掉最后一位数,重复k次,删掉k个数 时间复杂度:该算法主要进行了k次的for循环,每次循环的时间复杂度是o(n),故其时间复杂度为o(n) 空间复杂度:该算法不需要额外的数组或变量来存放数据,故其空间复杂度为o(1) 心得体会:在做题的时候还要再细心一点,特别对于一些小细节

『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 编辑距离问题 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 数字三角形 1.1 实践题目: 1

算法第5章上机实践报告

一.实践题目 7-2 工作分配问题 (20 分) 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 输入格式: 输入数据的第一行有1 个正整数n (1≤n≤20).接下来的n行,每行n个数,表示工作费用. 输出格式: 将计算出的最小总费用输出到屏幕. 输入样例: 在这里给出一组输入.例如: 3 10 2 3 2 3 4 3 4 5 输出样例: 在这里给出相应的输出.例如: 9 二.问题

算法第五章上机实践报告

一 . 实践题目 7-2 工作分配问题 二 . 问题描述 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 输入格式: 输入数据的第一行有1 个正整数n (1≤n≤20).接下来的n行,每行n个数,表示工作费用. 输出格式: 将计算出的最小总费用输出到屏幕. 输入样例: 3 10 2 3 2 3 4 3 4 5 输出样例: 9 三 . 算法描述 1. 解空间 第一个人选择第几个工作,第

二分查找真的那么简单吗?——算法第二章上机实践报告

一.        实践题目 改写二分搜索算法 (20 分) 题目来源:<计算机算法设计与分析>,王晓东 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 输入格式: 输入有两行: 第一行是n值和x值: 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔. 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j.当搜索元素在