• HUST——1110雪碧(简单DFS)


    1110: 雪碧

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 18  解决: 6

    题目描述

    杨神最近特别喜雪碧,他现在有两瓶,他大晚上的在街上走,他逢店加一倍(雪碧),逢摊吃大虾并喝一瓶(雪碧)。这一路走过去,遇到店n次,大排档m次,已知最后1次是小摊,大伙正好把雪碧喝完。请你计算杨神遇到店和小摊的次序,合理的次序一共有多少种?

    输入

    多组测试数据,每组输入2个整数n和m(均不大于10)

    输出

    对于每组测试数据输出一行,值为符合条件的次序数.

    样例输入

    1 3

    样例输出

    1

    显然题意可以转换成给你初始值x=2,给你n次将当前值乘2的机会和m次将当前值减1的机会,最后两者刚好用完且此时x=0的方案数有多少种。比赛刚开始以为是DP(DP恐惧症),后来发现应该是DFS,而且数据范围很小,暴力没问题。然后想着用三个参数来表示当前状态:(当前瓶子数,当前乘2的可用次数,当前减1的可用次数)。

    写完后样例可以过了,但是题目中说了最后一次是小摊,即在此之前不可以把瓶子变为0。

    然后重新加了个边界条件过了

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<sstream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<deque>
    #include<stack>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<map>
    using namespace std;
    typedef long long LL;
    #define INF 0x3f3f3f3f
    int ans=0;
    void dfs(int ping,int nn,int mm)
    {
        if(nn<0||mm<0||ping<0||(ping<=0&&nn>=1))//最后这个条件不能少,若乘2的机会还有但瓶子为0也算非法
            return ;
        if(ping==0&&nn==0&&mm==0)
        {
            ans++;
            return;
        }
        else
        {
            dfs(ping*2,nn-1,mm);
            dfs(ping-1,nn,mm-1);
        }
    }
    int main(void)
    {
        int n,m,i,j;
        while (~scanf("%d%d",&n,&m))
        {
            ans=0;
            dfs(2,n,m);
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    MySQL调优篇 | 逻辑架构解读(1)
    SQLPlus 在连接时通常有四种方式
    Oracle解决索引碎片功能
    windows2003 ftp 无法下载 解决
    bat记录
    ACCESS字符串操作函数
    缓存和RAID如何提高磁盘IO性能
    TortoiseSVN 命令 (命令行执行工具)
    在RHEL5下实现磁盘分区和磁盘配额
    PS 命令详解
  • 原文地址:https://www.cnblogs.com/Blackops/p/5766357.html
Copyright © 2020-2023  润新知