洛谷题单指南-暴力枚举-P2089 烤鸡
原题链接:https://www.luogu.com.cn/problem/P2089
题意解读:枚举所有情况,记录符合美味程度要求的即可。
解题思路:
有两种枚举方法:循环枚举、DFS暴搜
很显然,循环枚举需要十重循环,代码过于丑陋,下面只介绍DFS的方法:
只需要一个大小为10的数组记录某一种调料组合,从第一种调料一直递归到超过十种,判断和是否和美味值相同,相同则找到一种方案,
然后计数、记录,最后输出结果。
100分代码:
#include <bits/stdc++.h>
using namespace std;
int cnt; //方案数
int ans[60000][10]; //记录每种方案,因为一共10种调料,每种有1-3克三种放法,一共有3^10=59049种组合,约60000
int tmp[10]; //一种组合
int n;
void dfs(int k)
{
if(k == 10)
{
int sum = 0;
for(int i = 0; i < 10; i++) sum += tmp[i];
if(sum == n)
{
for(int i = 0; i < 10; i++) ans[cnt][i] = tmp[i];
cnt++;
}
return;
}
for(int i = 1; i <= 3; i++)
{
tmp[k] = i;
dfs(k + 1);
}
}
int main()
{
scanf("%d", &n);
dfs(0);
cout << cnt << endl;
for(int i = 0; i < cnt; i++)
{
for(int j = 0; j < 10; j++)
{
printf("%d ", ans[i][j]);
}
printf("\n");
}
}