洛谷 P2089 烤鸡【DFS递归/10重枚举】

【链接】:https://www.luogu.org/problemnew/show/P2089

题目描述

猪猪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 【分析】:代码注释【代码】:

//深搜+剪枝,大量for循环存在时,就可以用递归表示。
/*
DFS搜索大法强吼!!从第一种配料开始枚举,直至到第十种,
每一种配料可能的取值有3种,分别为1,2,3。套用DFS模板即可解决。
*/
#include<bits/stdc++.h>

using namespace std;
int n;

int kind,ans[10000][10],a[10];

void dfs(int total,int cur) //所有配料质量之和,当前放入配料种数的盒子
{
    if(cur==10) //恰好10个盒子都放了配料
    {
        if(total==n) //烤鸡的美味程度为所有配料质量之和
        {
            for(int j=0;j<10;j++)
                ans[kind][j]=a[j];
             kind++; //合法则搭配方案++,这条必须放在后面
        }
    }
    else{
        for(int i=1;i<=3;i++) //每种配料可以放1—3克
        {
            a[cur]=i; //i克配料放入第cur个盒子
            dfs(total+i,cur+1); //相当于10重循环
        }
    }
}
int main()
{
    cin>>n;
    dfs(0,0);
    cout<<kind<<endl;
    for(int i=0;i<kind;i++)
    {
        for(int j=0;j<10;j++)
            cout<<ans[i][j]<<" ";
        cout<<endl;
    }
}

无回溯递归

原文地址:https://www.cnblogs.com/Roni-i/p/8280160.html

时间: 2024-12-15 19:12:12

洛谷 P2089 烤鸡【DFS递归/10重枚举】的相关文章

洛谷 P2089 烤鸡

P2089 烤鸡 题目背景 猪猪hanke得到了一只鸡 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末.孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和 现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案 输入输出格式 输入格式: 一行,n<=5000 输出格式: 第一行,方案总数 第二行至结束,10个数,表示每种配料所放的质量 按字典序排列. 如果没有符合要求的方

P2089 烤鸡

题目背景 猪猪hanke得到了一只鸡 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末.孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和 现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案 输入输出格式 输入格式: 一行,n<=5000 输出格式: 第一行,方案总数 第二行至结束,10个数,表示每种配料所放的质量 按字典序排列. 如果没有符合要求的方法,就只要在第一行

被军训:P2089 烤鸡

题目背景 猪猪 Hanke 得到了一只鸡. 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 1010 种配料(芥末.孜然等),每种配料可以放 11 到 33 克,任意烤鸡的美味程度为所有配料质量之和. 现在, Hanke 想要知道,如果给你一个美味程度 nn ,请输出这 1010 种配料的所有搭配方案. 输入格式 一个正整数 nn,表示美味程度. 输出格式 第一行,方案总数. 第二行至结束,1010 个数,表示每种配料所放的质

洛谷 P1379 八数码难题 Label:判重&amp;&amp;bfs

特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入输出格式 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数

[模板]洛谷T3369 普通平衡树 链表&amp;递归版、无父指针版Splay

结构体node定义:呐...因为不是Treap,所以就不必定义优先级yx了: 这次为了代码简短,总算是把判断子树方向函数(cmp)和节点信息维护函数(maintain)封在了结构体里. 旋转函数rotate:与Treap相比,没有任何变化,就是写得简短了一些. 插入函数insert:Treap时需要对违反堆性质的节点进行上浮的操作现在不需要了,只需同普通BST一样直接插入即可. 插完后,对刚插入的节点执行Splay操作. 删除函数del:针对待删除节点左右子树均非空的情况,Treap做法是将左右

[模板]洛谷T3391 文艺平衡树 链表&amp;递归版、无父指针版Splay

指针大法好 无父指针Splay大法好 大佬们的"改变旋转方向"萌新表示不懂,于是就自己乱搞出了下面的搞法... 代码如下,萌新写的丑,诸位大佬见谅QwQ~ 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<ctime> 5 #include<cstdlib> 6 #include<ctime> 7 8 #include<

(综合)P2089 烤鸡

题解: #include<stdio.h>int n,ret=0,a[10000][10];int p(int c,int s){ int i; for(i=1;i<=3;i++){   s+=i;   if(c==9){     if(s==n){       a[ret][c]=i;       ret++;       return 1;     }else{      s-=i;       continue;     }   }else{     if(p(c+1,s)){ 

洛谷P1120小木棍[DFS]

题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度. 输出格式: 输出文件仅一行,表示要求

洛谷.2219.[HAOI2007]修筑绿化带(单调队列)

题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区域的最小值,可以先将每行看做一个数列,对于每个点y,得到一个[y-(B-3),y]的最小值 处理完行后得到Minr[][],对每列的进行同样的操作,就可以得到Min[x][y]表示([x-A+3,x],[y-B+3,y])的最小矩形和 但是注意单调队列处理的是S2,S2表示的是C\(*\)D的和,n