算法第四章作业
对贪心算法的理解
首先就是新学到的函数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函数总是用错,会场问题也不是理解的很好,结对挺好的,还是想之前一样各自打,最后合在一起讨论