6Luffy6

导航

烤鸡

传送锚点:https://www.luogu.com.cn/problem/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\)

思路

code

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
const int maxn =60000;
int mem[maxn][11];//记录方案可能性 59055大概接近于3的10次方 
int nums[11];//存储10种调料放几克
int res = 0;//记录方案数
void dfs(int x,int cnt) {//遍历的坐标
	if(cnt > n) return;
	if (x > 10) {//质量和超过题目所给,剪枝
		if (cnt == n) {
			res ++;
			for (int i = 1; i <= 10; i++) { 
				mem[res][i] = nums[i];
			}
		}
		return;
	}
	for (int i = 1; i <= 3; i++) {
		nums[x] = i;
		dfs(x + 1, cnt + i);
		nums[x] = 0;
	}

}
int main()
{
	cin >> n;
	dfs(1, 0);
	cout << res << endl;
	for (int i = 1; i <= res; i++) {
		for (int j = 1; j <= 10; j++) {
			cout << mem[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

posted on 2024-05-21 14:04  极客三刀流  阅读(35)  评论(0)    收藏  举报