洛谷p2089 烤鸡 --- (两种方法 + 详细注释 + C++实现 )
作者:互联网
题目描述
猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和
现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案
输入格式
一行,n<=5000
输出格式
第一行,方案总数
第二行至结束,10个数,表示每种配料所放的质量
按字典序排列。
如果没有符合要求的方法,就只要在第一行输出一个“0”
输入输出样例
输入 #1复制
11
输出 #1复制
10 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1
说明/提示
枚举
//本题提示说枚举,其实也可搜索(核心也是枚举)
//由于要求先输出种类数,再输出每种情况,所以要把每种情况先储存起来,所以二维数组a储存结果,操作一维数组temp
#include<iostream>
using namespace std;
int n, cnt, a[10000][10], temp[10];
void dfs(int step, int sum) { //step为第几种调料,sum目前的配料之和
int i;
if (step == 10) { //当10种调料都分析完了
if (sum == n) { //如果配料之和等于输入值
for (i = 0; i < 10; i++)
a[cnt][i] = temp[i]; //把temp数组的元素都转移到二维数组a里面
cnt++; //cnt为满足的情况数
}
return;
}
for (i = 1; i < 4; i++) { //每种调料有三种情况,分别为1,2,3
temp[step] = i; //第step种调料的配料为i
dfs(step + 1, sum + i); //递归,对下一种调料做同样的分析
}
}
int main() {
int i, j;
cin >> n;
dfs(0, 0);
if (!cnt) //如果一种情况都没有
cout << "0";
else { //有情况
cout << cnt << endl; //先输出种类数
for (i = 0; i < cnt; i++) { //输出二维数组a
for (j = 0; j < 10; j++)
cout << a[i][j] << " ";
cout << endl; //输出每种情况后换行
}
}
return 0;
}
//后来看到有的大佬暴力枚举也AC了,在此引用一下他们的代码:
#include<iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f,g,h,i,j,in,x=0;
cin>>in;
for (a=1;a<=3;a++)
{
for (b=1;b<=3;b++)
{
for (c=1;c<=3;c++)
{
for (d=1;d<=3;d++)
{
for (e=1;e<=3;e++)
{
for (f=1;f<=3;f++)
{
for (g=1;g<=3;g++)
{
for(h=1;h<=3;h++)
{
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
if (a+b+c+d+e+f+g+h+i+j==in)
{
x++;
}
}
}
}
}
}
}
}
}
}
}
cout<<x<<endl;
for (a=1;a<=3;a++)
{
for (b=1;b<=3;b++)
{
for (c=1;c<=3;c++)
{
for (d=1;d<=3;d++)
{
for (e=1;e<=3;e++)
{
for (f=1;f<=3;f++)
{
for (g=1;g<=3;g++)
{
for(h=1;h<=3;h++)
{
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
if (a+b+c+d+e+f+g+h+i+j==in)
{
cout<<a<<" ";
cout<<b<<" ";
cout<<c<<" ";
cout<<d<<" ";
cout<<e<<" ";
cout<<f<<" ";
cout<<g<<" ";
cout<<h<<" ";
cout<<i<<" ";
cout<<j<<endl;
}
}
}
}
}
}
}
}
}
}
}
}
呆码农梦中识bug,程序员哭求加工资 发布了47 篇原创文章 · 获赞 46 · 访问量 3243 私信 关注
标签:10,cnt,洛谷,temp,int,step,C++,p2089,配料 来源: https://blog.csdn.net/qq_45472866/article/details/104092867