反证法证明“删数问题”的算法满足贪心选择性质
1. 请用反证法证明“删数问题”的算法满足贪心选择性质(即设最优解不包含贪心选择,则可以通过转换找出一个更小的数,推出矛盾)
删数的代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
cin >> a;
int k;
int len = a.length();
cin >> k;
while(k > 0){
int flag = 0;
for(int i = 0; i < len - 1; i++){
if(a[i] > a[i+1]){
for(int j = i; j < len - 1; j++){
a[j] = a[j+1];
}
len--;
k--;
flag = 1;
break;
}
}
if(flag == 0){
len -= k;
k = 0;
}
}
if(len == 0){
cout << 0;
return 0;
}
int i = 0;
while(a[i] == '0' && i < len){
i++;
}
for(; i < len; i++){
cout << a[i];
}
}
采用的贪心策略是:从数组的第一位开始找到第一段递减区间,删去递减取区间的第一个数字。
例如:3215689740
假设我们删去一个数,我们选择的是删去之后高位最小的数,即215689740;
删去两个数,15689740;
删去三个数,15689740:1689740,1589740,1569740,1568740,1568940,1568970,1568974,可得最终的数字为1568740
如果我们采用贪心选择时所得到的最终结果不是最小的值,说明我们在删去第一个数或者第二个数的时候有更优的选择,但是我们在采用贪心选择时所得到的已经是最优的选择了,所以不存在有更优的最终解。
2. 结合本章的学习,总结你对贪心法的体会和思考
贪心法是在每一步都对当前的处境做出一个最优的选择,没有动态规划的回退等操作,每一步操作就是一个当前最优的选择。核心思路是基于一步步的局部最优解希望能够导出全局最优解。
这可能导致它找到的只是满足需求的最优解,而不是全局的一个最优解。
还有一个就是不能解决具有后效性的问题。对于这类问题,贪心算法无能为力,因为它无法回退到之前的状态重新做出决策。
相关推荐
delete_number.rar_delete number
删数问题(简单贪心算法),一个很简单的算法,一看就懂,开阔一下思路
普及讲座6基于贪心的算法和应用举例C版.pptx
普及讲座6基于贪心的算法和应用举例C版.pptx
算法作业——多处最优服务次序问题
设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1≦i ≦n 。共有s处可以提供此服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。
222直接证明与间接证明-反证法.ppt
222直接证明与间接证明-反证法.ppt
反证法在数学分析证明题中的技巧与应用(数学专业 毕业论文).doc
反证法是一种重要的证明方法,它的基本思想是“否定-推理-矛盾-肯定”,反证法历史悠久,曾被用来解决数学中许多重要结论,所以它极大地推动了数学的发展,解决了数学中许多难以解决的问题,学会构造反证法是一种重要的数学技能。本文就基于这方面的考虑,讨论了反证法的逻辑依据、使用方法、使用技巧以及在数学分析中适合用反证法的题目做了总结,并通过实例对反证法在数学分析证明题中的技巧和应用进行了详细的讲解,并通过具体实例进行了归纳总结。


