【洛谷p2089】 烤鸡

烤鸡【题目链接】

感觉我超废

关于算法:有很多很多算法吧,但自我感觉最重要的是递归的算法;


SOLUTION:

首先忍不住要吐槽这个神仙数据:

嗯???定睛一看,它这数据范围莫不是白瞎了,因为每种配料可以放1—3克,共10种配料,所以美味程度最大是30,大于30的显然都无解,于是很愉快呀,我们就可以不用搜索30以上的啦,那么我们暴力就好了啊。对于题解的话,出现了好多直接10个for循环跑的

正解显然不是10个for循环跑过,但是数据太水,for循环也确实跑得过qwq;

据析正解应该是搜索?可是我感觉我明明写了个递归啊?果真dfs都是递归。

其实这道题就是考察给我们一个数,把它划分成10份的方法有几种,让我想到了这道题。与数的划分不同,烤鸡这道题需要考虑顺序,而数的划分不需要。

1.首先是输入n啦,如果n>30我们直接判无解,避免去递归浪费时限,不过:亲测并没有无解的分欸qwq:

(已经将无解判断注释掉了)

2.然后就是递归的计算ans了

rest 表示还有多少美味程度没有被划分给这10种配料

num 表示这10种配料还有多少种没有分到美味值

目标状态:rest=num=0;

 1.三个临界条件:

  • 当rest=0&&num=0时,说明刚好划分完,那么ans++;
  • 当rest=0但是num!=0时,说明这样划分不可以,因此return 0;
  • 当num=0但是rest!=0时,同样说明这样划分不可以,所以return 0;

2.对于如何储存每种配料的美味值然后输出,这个很迷;开始的时候我是想直接二维数组存下来,但是很尴尬啊,我并没有成功输出是这样的:

改了好久都改不对,现在想想,可能递归写的乱七八糟,直接二维数组存存乱了吧qwq,然后又开了一个一维数组来存储每个ans对应的美味值,最后在rest=0&&num=0时传给二维数组,这样就对了。

尽管还是没有搞明白二维数组是咋错乱的qwq,反正它错乱了;

Code:

#include <bits/stdc++.h>

using namespace std;

int n, a[11000][11], ans, b[11];

bool dg(int rest, int num) {
    if (rest == 0 && num == 0) {
        ans++;
        for (int i = 1; i <= 10; i++) {
            a[ans][i] = b[i];
        }
        return 1;
    }
    if (rest == 0)
        return 0;
    if (num == 0)
        return 0;
    for (int i = 1; i <= 3; i++) {
        b[10 - num + 1] = i;
        dg(rest - i, num - 1);
    }
    return 1;
}

int main() {
    scanf("%d", &n);
    if (n > 30) {
        cout << "0" << endl;
        return 0;
    }
    dg(n, 10);
    cout << ans << endl;
    for (int i = 1; i <= ans; i++) {
        for (int j = 1; j <= 10; j++) {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
}

end-

原文地址:https://www.cnblogs.com/zhuier-xquan/p/11003995.html