递归,贪心

我的未来我决定 提交于 2020-03-09 00:25:47

递归

   递归算法是指程序直接或间接调用自身的技巧;他通常把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解。其基本思想为层层分解,关键在于找出递归定义和终止条件。

例题

G:括号匹配问题

字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注.

			Input
	输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100

注意:cin.getline(str,100)最多只能输入99个字符!
Output
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"","?""","?"和空格组成,"“和”?"表示与之对应的左括号和右括号不能匹配。

SAMPLE INPUT
((ABCD(x)
)(rttyy())sss)(

SAMPLE OUTPUT

((ABCD(x)
$$
)(rttyy())sss)(
? ?$

为解决此问题引入STACK函数

在这里插入图片描述

#include<iostream>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
char a[101];
int main()
{
    int i;
    stack<int>b;
    string str;
    while(cin>>str)
    {
        memset(a,' ',100);//将a中所有元素值设置为空格
        for(i=0;i<str.size();++i)
        {
            if(str[i]=='(')//如果碰到'(',将其放入栈顶
                b.push(i);
            else if(str[i]==')')//如果碰到')'而栈内是空的,则说明没有'('与其匹配;反之即有,并清除栈顶元素
            {
                if(b.empty())
                    a[i]='?';
                else
                    b.pop();
            }
        }
        while(!b.empty())如果循环结束后栈内还存在'(',则说明没有')',与其匹配
        {
            a[b.top()]='$';
            b.pop();
        }
        cout<<str<<endl;
    cout<<a<<endl;
    }
    return 0;
}

贪心

贪心是一种求最优解的方法。它是按照某种最优策略,将复杂问题层层分解成子问题(一般只有一个),并由子问题的最优解回溯出整个问题的最优解。
解题的一般步骤是:

1.建立数学模型来描述问题;

2.把求解的问题分成若干个子问题;

3.对每一子问题求解,得到子问题的局部最优解;

4.把子问题的局部最优解合成原来问题的一个解。

钱币找零问题

假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5,
c6张。现在要用这些钱来支付K元,至少要用多少张纸币?

要想解决此问题,每一次尽可能用面值大的纸币即可。

#include<iostream>
#include<algorithm>
using namespace std;
const int m=7; 
int Count[m]={3,0,2,1,0,3,5};
int Value[m]={1,2,5,10,20,50,100};
int solve(int money) 
{
    int num=0;
    for(int i=m-1;i>=0;i--)
    {
          int c=min(money/Value[i],Count[i]);
          money=money-c*Value[i];
          num+=c;
    }
    if(money>0) num=-1;
    return num;
}

int main() 
{    
    int money;
    cin>>money;
    int res=solve(money);
    if(res!=-1) 
         cout<<res<<endl;
    else 
         cout<<"NO"<<endl;
}

小结

总的来说,虽然递归和贪心题目有些很难考虑,但利用递归和贪心解决题目会更加快捷简洁,并且结构清晰,可读性强。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!