C++ 深度优先搜索 (DFS) 回溯算法
问题描述
来源:洛谷 P2089 烤鸡
有 10 种配料,每种配料可以放 1 到 3 克。任意烤鸡的美味程度为所有配料质量之和。 给定一个美味程度 n,输出这 10 种配料的所有搭配方案。
解题思路
本题的核心是枚举所有可能的配料组合,同时满足「累加和=n」「配料数=10」两个严格约束,属于典型的组合枚举 + 约束剪枝问题。这类问题最经典、最高效的解法是 DFS(深度优先搜索)+回溯算法。
DFS 负责递归枚举每一步选择的配料美味值 (1/2/3),回溯负责在递归结束后「撤销选择」,恢复现场,从而枚举所有可能性。
代码实现
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int n, ans = 0;
string s;
vector<string> v;
// val:当前累计的美味程度总和
// cou:当前已选择的配料数量
void dfs(int val, int cou) {
// 递归终止条件 1:找到合法方案 → 记录答案 + 方案
if (val == n && cou == 10) {
v.push_back(s); // 将合法的配料组合存入 vector 容器
ans++; // 合法方案数 +1
return;
}
// 递归终止条件 2:剪枝(无效路径,直接返回)
if (val > n || cou >= 10) {
return;
}
// 枚举当前步的所有选择:配料美味值只能是 1、2、3
for (int i = 1; i <= 3; i++) {
// 1. 做出选择:拼接当前配料值到方案字符串,先加空格,再加数字字符
s.push_back(' ');
s.( + i);
(val + i, cou + );
s.();
s.();
}
}
{
cin >> n;
( i = ; i <= ; i++) {
s.( + i);
(i, );
s.();
}
cout << ans << endl;
(string str : v) {
cout << str << endl;
}
;
}


