【搜索】售货员的烦恼(trouble)

题目描述

一间冰淇淋商店刚刚开张,外面有2×N个人购买1元的冰淇淋,其中一半人拿着1张2元人民币,另一半人拿一张1元人民币。售货员很粗心,没有准备零钱,要使出售过程中不发生找钱困难的问题,这2×N个人应该如何排队?请你帮售货员找出所有方案数量的总和。

输入

一个整数N(N≤15)。

输出

方案总数M。

样例输入

4

样例输出

14

#include <bits/stdc++.h>

using namespace std;

int n;
int ans = 0;
int cnt1 = 0,cnt2 = 0;
void dfs(int now)
{
    if(cnt1>n||cnt2>n)
    {
        return;
    }
    if(now==2*n)
    {
        ans++;
        return;
    }
    else
    {
        if(cnt1<cnt2)
        {
            return;
        }
        else
        {
            cnt1++;
            dfs(now+1);
            cnt1--;
            cnt2++;
            dfs(now+1);
            cnt2--;
        }
    }
}

int main()
{
    cin>>n;
    dfs(0);
    cout<<ans;
    return 0;
}

要找开钱 只需要1块的数量大于等于2的数量 cnt1为1块的数量 cnt2为2块的数量

并且要注意边界cnt1 cnt2不能大于n

写这个题解的原因是 也许是今天写了很多搜索     这道题迷迷糊糊的写过了的   应该是感觉对了吧  (虽然刷的都是入门的题目)

dfs最重要的是判断每一次搜索改变的量是什么   边界条件是什么 就离AC很近了

猜你喜欢

转载自www.cnblogs.com/hao-tian/p/9351399.html