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

​

 

洛谷p2089 烤鸡   ---   (两种方法 + 详细注释 + C++实现 )洛谷p2089 烤鸡   ---   (两种方法 + 详细注释 + C++实现 ) 呆码农梦中识bug,程序员哭求加工资 发布了47 篇原创文章 · 获赞 46 · 访问量 3243 私信 关注
上一篇:python – paste.httpserver并使用HTTP / 1.1 Keep-alive减速;用httperf和ab测试


下一篇:洛谷-P2089 烤鸡