算法第四章作业
1、你对贪心算法的理解:贪心算法,就是根据当前面临的问题做出最优选择,最终得到整个问题的解。每做一次选择,问题规模就小一层。贪心算法的关键在于具体的选择策略。如何保证该策略始终能得出最优解、如何保证当前的最优解一定包含其子问题的最优解,是设计一个贪心算法的核心。
2、请选择一道题目说明你的算法满足贪心选择性质
题目如下
4-2 删数问题 (110分)
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
输入样例:
在这里给出一组输入。例如:
178543
4
输出样例:
在这里给出相应的输出。例如:
13
具体代码如下:
#include <iostream> #include <algorithm> using namespace std; int main(){ char x[1005]; int a[1005]; int n; int length; char border=x[1005]; cin>>x; cin>>n; for(length=0;x[length]!=border;length++) { a[length]=x[length]-'0'; } int select=length-n; int pos=0; int flag=0; while(select!=0){ int min=9; for(int i=pos;i<length;i++){ if(a[i]<min && i<=length-select){ min=a[i]; pos=i+1; } } select--; if(flag==0 && min!=0) { flag=1; cout<<min; continue; } if(flag!=0) cout<<min; } if(flag==0) cout<<'0'; return 0; }
在这个问题中,select表示需要从给定的数中挑出几位数。该题采用的贪心策略为:每一次循环,都查找pos后最小的数(pos初值为0),并且该最小数的下标i必须满足 i<=length-select,否则其子问题将得不到足够的数。
3、请说明在本章学习过程中遇到的问题及结对编程的情况
本章学习中没有遇到太多很复杂的问题。贪心算法本身的实现不难,难点在于确定该题具有贪心算法所要求的性质。在结对编程时,对于上面的这道删数问题,我和同伴产生了分歧,他使用二维数组存放数据,而我认为一维数组已经可以满足需求。经过讨论后我们最终决定使用一维数组,二维数组不但浪费空间,而且难以操作,最后齐心协力将代码完成。