算法——第四章作业
第四章 贪心算法
1.对贪心算法的理解:
在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。是一种不同于动态规划(自底向上)的、、依赖于以往的选择自顶向下的算法,以迭代方式做出相继的贪心选择,选择后不断简化成规模更小的子问题。但这种算法在一些具体题目上可能得到的不是最优解(不能达到预期目的)。
eg.例如货币找零中给出1,4,6元需找零8元时,最优解是2张4元,而不是按贪心算法从1开始寻找,即2张1元、1张6元——不是最优解。
2.满足贪心选择性质的算法:
设有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
(代码只需在主函数里即可完成要求,如下:)
1 #include<iostream>
2 #include<algorithm>
3 using namespace std;
4
5
6 int main()
7 {
8 int n,L;
9 int size[1000];
10 int ans = 0;//最多能容纳的文件数
11 cin >> n >> L;
12 for(int i = 0; i < n; i++)
13 {
14 cin >> size[i];//输入各文件大小
15 }
16 sort(size,size+n);//从小到大排序
17
18 int sum = 0;
19
20 for(int i = 0; i < n; i++)
21 {
22 sum += size[i];
23 if(sum <= L)//判断是否到达磁盘最长长度
24 ans++;
25 }
26 cout << ans << endl;
27 return 0;
28 }
p.s.该题是典型的贪心算法的题,主要利用了结果是能容纳最多的程序数——也就是使用从小到大的排序来进行贪心选择放入磁盘的程序。
所以过程中的关键就是排序以及判断磁盘是否还有剩余空间安放另一个程序,以此得到最终结果。
3.本章学习过程中遇到的问题及结对编程的情况
本章贪心算法的题目中我和冬璇都可以先自己进行对题目的思考,并敲出代码,最终我俩都通过测试之后便开始交换思路一起讨论,发现我和她的代码逻辑几乎是一致的,所以最终能信任我们对这道题目的理解。上机课遇到的第二题“删数问题”,最终我们在中途一段代码的理解出了一些小分歧,没办法理解双方的思路(关于到底怎么把要删的数从一个字符串中删去),于是我们一起跟着代码用测试案例一步步走下来,终于弄懂了代码的逻辑安排,了解了是通过不断赋值更新替换所删数的位置,并移到字符串最后一位再把len减1后直接cut掉我们要删的数,解决了问题。过程中我感觉不断地在跟着搭档一起学习与成长,对敲代码题也没那么抗拒和没思路了,希望我们在接下来的学习中继续培养这种默契度,也培养我们自己代码的可理解性~