#include using namespace std; int cnt, sum; //cnt是方案数,sum为小明当前手牌数 void dfs(int u) { //u是当前牌的种类 if (sum > 13 || u > 13) return; //如果手牌数超过13张 或 牌的点数大于13 则返回 if (sum == 13) { //如果手牌数刚好够13张,说明刚好满足一组方案,cnt++并且返回上一层 cnt++; return; } for (int i = 0; i <= 4; i++) { //对于每个牌种,可以有五种选择,不拿或者拿1~4张 sum += i; //对于每种选择 累加到小明的 手牌数当中 dfs(u + 1); //对于他的每种选择都往下搜索,直到不能再往下走为止 sum -= i; //每次回溯的时候,都需要把他刚才的选择给撤回 } } int main() { dfs(0); //初始状态为0 当第一次进入dfs时候,第一个for循环里面是dfs(1) 此时代表的是 对牌种1的五种选择进行 dfs cout << cnt << endl; return 0; }