洛谷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;  
                                            }  
                                        }  
                                    }  
                                }  
                            }  
                        }  
                    }  
                }  
            }  
        }  
    }  
} 

​

 

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
el-footer是Element UI库中的一个组件,用于在页面底部添加一个固定的页脚。它的使用方式如下: ```html <template> <div> <el-header>Header</el-header> <el-main>Main Content</el-main> <el-footer>Footer</el-footer> </div> </template> ``` 在上面的例子中,el-header、el-main和el-footer分别代表页面的头部、主体和底部。el-footer会被固定在页面底部,无论页面内容的高度是多少。 如果你想让el-footer沉底,即当页面内容不足以撑满整个屏幕时,让el-footer始终保持在页面底部,可以使用CSS中的flex布局来实现。具体的代码如下: ```html <template> <div class="container"> <div class="content"> <!-- 页面内容 --> </div> <el-footer class="footer">Footer</el-footer> </div> </template> <style> .container { display: flex; flex-direction: column; min-height: 100vh; } .content { flex: 1; } .footer { margin-top: auto; } </style> ``` 上面的代码中,我们创建了一个flex容器(class为container),设置了它的`min-height`为`100vh`,确保容器至少占满整个屏幕高度。然后,将页面内容放在一个div(class为content)中,并设置其`flex`属性为1,让它占满剩余的空间。最后,将el-footer的`margin-top`属性设置为`auto`,使其自动填充剩余的空间,从而将el-footer沉底。 这样,无论页面内容的高度是多少,el-footer都会保持在页面底部。希望对你有帮助!如有其他问题,请继续提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值