【搜索】售货员的烦恼(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很近了