算法第四章作业

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、请说明在本章学习过程中遇到的问题及结对编程的情况

 本章学习中没有遇到太多很复杂的问题。贪心算法本身的实现不难,难点在于确定该题具有贪心算法所要求的性质。在结对编程时,对于上面的这道删数问题,我和同伴产生了分歧,他使用二维数组存放数据,而我认为一维数组已经可以满足需求。经过讨论后我们最终决定使用一维数组,二维数组不但浪费空间,而且难以操作,最后齐心协力将代码完成。

posted @ 2020-11-14 00:43  你又熬夜了  阅读(146)  评论(0编辑  收藏  举报