三爽

导航

算法第四章作业

对贪心算法的理解

首先就是新学到的函数sort,头文件是algorithm

其次就是关于贪心算法的一些思想:贪心算法给我的感觉,区别于前面学到的动态规划 分治法,贪心算法的运用很灵活。而且有一点很不同的就是,贪心算法只是局部问题解的最优化,有一些针对与全局问题上面,贪心算法反而不好用。其次,动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。 对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

具体例子就是背包问题和0-1背包问题:0-1背包:在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。背包:选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包。对于0-1背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。这时候动态规划算法的确可以有效地解0-1背包问题。

贪心算法解题的一般步骤是:

1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。

 

具体作业代码:

删数问题:代码如下

#include <iostream>
#include<algorithm>
#include<string>
#include<bits/stdc++.h>

using namespace std;

int main() {
    string a;
    int n,i,j,k;//
    cin>>a;
    cin>>n;
    int len=a.size();
    for(k=0;k<n;k++)//控制循环次数 
    {
        for(i=0;i<len-1;i++) 
        {
            if(a[i]>a[i+1])//删数 
            {
                for(j=i;j<len-1;j++)
                    a[j]=a[j+1];
                break;
            }
        }
        len--;//不管怎样,长度都会小一,比如123456这种情况,上面的是无法满足的 
    }
    
    i=0;
    while(i<=len-1&&a[i]=='0')
        i++;
        
    if(i==len)
        cout<<"0"<<endl;
    else
        for(j=i;j<=len-1;j++)
            cout<<a[j];
    return 0;
}

比较完以后把大的数删除就好了

 

3、学习情况和结对情况:

刚开始sort函数总是用错,会场问题也不是理解的很好,结对挺好的,还是想之前一样各自打,最后合在一起讨论

 

posted on 2020-11-13 17:08  三爽  阅读(92)  评论(0编辑  收藏  举报