P2089 烤鸡

烤鸡

题目背景

猪猪 Hanke 得到了一只鸡。

题目描述

猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 \(10\) 种配料(芥末、孜然等),每种配料可以放 \(1\)\(3\) 克,任意烤鸡的美味程度为所有配料质量之和。

现在, Hanke 想要知道,如果给你一个美味程度 \(n\) ,请输出这 \(10\) 种配料的所有搭配方案。

输入格式

一个正整数 \(n\),表示美味程度。

输出格式

第一行,方案总数。

第二行至结束,\(10\) 个数,表示每种配料所放的质量,按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个 \(0\)

样例 #1

样例输入 #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

提示

对于 \(100\%\) 的数据,\(n \leq 5000\)

2.题解

2.1 枚举 + 宏

思路

每种调料有[1,3]的情况,我只要嵌套十层循环,即枚举所有的情况和n比较看有没有即可。

代码

#include <bits/stdc++.h>
using namespace std;
#define rep(i) for (int i = 1; i <= 3; i++)
int main() {
    int n, ans = 0;
    stringstream buffer;
    cin >> n;
    rep(a) rep(b) rep(c) rep(d) rep(e) rep(f) rep(g) rep(h) rep(i) rep(j) 
		if (a + b + c + d + e + f + g + h + i + j == n) {
        	ans++;
       		buffer << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << ' ' << f
               << ' ' << g << ' ' << h << ' ' << i << ' ' << j << endl;
    	}
    cout << ans << endl;
    if (ans != 0) cout << buffer.str();
}

时间复杂度

O(1),跟n无关

2.2 优化

思路

主要考虑的是:假设当a,b,c,d的和已经超过了n,那么就没必要再枚举后面的e,f,g,h...了
可以倒着来看,至于rep中的式子怎么来着,看下图最后三段即可知道

代码

posted @ 2024-02-15 20:08  DawnTraveler  阅读(29)  评论(0编辑  收藏  举报