10个for循环暴力枚举烤鸡
题目来自洛谷
https://www.luogu.com.cn/problem/P2089
题目描述
猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 101010 种配料(芥末、孜然等),每种配料可以放 111 到 333 克,任意烤鸡的美味程度为所有配料质量之和。
现在, Hanke 想要知道,如果给你一个美味程度 nnn ,请输出这 101010 种配料的所有搭配方案。
输入格式
一个正整数 nnn,表示美味程度。
输出格式
第一行,方案总数。
第二行至结束,101010 个数,表示每种配料所放的质量,按字典序排列。
如果没有符合要求的方法,就只要在第一行输出一个 000。
样例输入
11
样例输出
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
提示
对于 100%100\%100% 的数据,n≤5000n \leq 5000n≤5000。
直接开始优雅的暴力烤鸡枚举,第一次看见的时候属实给我震撼了一波,关键更摧毁我三观的是,这代码竟然还过了判题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;
}
}
}
}
}
}
}
}
}
}
}
} //so beautiful!
这波实在是太优雅了!
深度优先搜索正解!
#include<bits/stdc++.h>
using namespace std;
int s,flag=0,sum=0;//flag判断是否有解,sum方案总数
int nice[11],ans[20000][11];
void dfs(int dep,int total){//dep代表当前放第几种配料,total代表当前的配料和
if(dep==11){//若放到最后一个格子
if(total==s){//若所有配料质量之和达到美味程度
flag=1;
sum++;
for(int j=1;j<=10;j++)//存储当前方案
ans[sum][j]=nice[j];
}
return;
}
else
{
for(int i=1;i<=3;i++){//当前这种配料有三种放法
if(total+i>s) break;
else{
nice[dep]=i;//存储
dfs(dep+1,total+i);//搜索下一种配料
nice[dep]=0;
}
}
}
}
int main(void){
cin>>s;//输入
dfs(1,0);
if(flag==1){
cout<<sum<<endl;//输出总数
for(int i=1;i<=sum;i++){//输出全部方案
for(int j=1;j<=10;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
}
else if(flag==0){//若无解
cout<<0<<endl;
}
return 0;
}
本文介绍了一道趣味编程题:通过暴力枚举和深度优先搜索(DFS)算法来找出所有可能的烤鸡配料组合,使得配料总重量等于给定的美味程度。文章提供了两种解题思路的源代码示例。
504

被折叠的 条评论
为什么被折叠?



