|
|
发表于 2026-9-23 05:53:36
|
显示全部楼层
思路:递归 = 每层决定一种配料放几克
把 10 种配料看成 10 层决策。第 k 层选 1、2、3 克,同时记录当前总美味值 sum。
当 k == 11 时,说明 10 种配料都选完了,如果 sum == n,就保存这一组方案。
因为每次从 1 到 3 顺序尝试,所以天然按字典序得到方案。
注意
每种配料最少 1 克,10 种最少 10 克;最多 3 克,10 种最多 30 克。
所以 n < 10 或 n > 30 时直接输出 0。
先搜索并保存所有方案,最后先输出方案总数,再输出每种方案。
代码
- #include <bits/stdc++.h>
- using namespace std;
- int n, a[11];
- int ans[60000][11];
- int cnt = 0;
- void dfs(int k, int sum) {
- if (sum > n) return; // 剪枝:已经超过 n,不用继续
- if (k == 11) {
- if (sum == n) {
- for (int i = 1; i <= 10; i++) {
- ans[cnt][i] = a[i];
- }
- cnt++;
- }
- return;
- }
- for (int i = 1; i <= 3; i++) {
- a[k] = i;
- dfs(k + 1, sum + i);
- }
- }
- int main() {
- cin >> n;
- if (n < 10 || n > 30) {
- cout << 0 << endl;
- return 0;
- }
- dfs(1, 0);
- cout << cnt << endl;
- for (int i = 0; i < cnt; i++) {
- for (int j = 1; j <= 10; j++) {
- cout << ans[i][j] << " ";
- }
- cout << endl;
- }
- return 0;
- }
复制代码
为什么不会漏?
每个位置都试了 1、2、3,相当于把所有 10 种配料的组合都走了一遍。
只要总和等于 n,就保存下来。最多 3^10 = 59049 种,数组开 60000 够用。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|