P2089 烤鸡

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

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

输入格式
一个正整数 n,表示美味程度。

输出格式
第一行,方案总数。

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

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

说明/提示
对于 100% 的数据,n≤10000。

精炼题目意思:我需要选10个数,每个数可以是1,2,3最后这10个数加起来等于N(有解时N的范围是10~30)

那么思路就是每个位置都有三种可能,1,2或3
我需要把每个位置的可能性都遍历一遍,然后计算总和会不会等于N
如果等于N的话,我就把那些数一个一个整理起来
如果大于N的话,直接返回,让它回到上一个节点(剪枝)
我们想要注意遍历的位置不能超过10,我们只有10个位置要遍历,如果超过10的话,也要返回到上一个节点(剪枝)

所以限定条件要满足条件:

遍历位置不超过10
总数不超过n

头代码

点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int N=20;

int n;
int arr[N];
int rest=0;
int mem[10000][11];

dfs遍历函数

点击查看代码
void dfs(int x,int sum){
	if(sum>n) return ;
	
	if(x>10){
			if(sum==n){
			rest++;
			for(int i=1;i<=10;i++){
				mem[rest][i]=arr[i];
			}
		}
		return ;
	}
	
	
	for(int i=1;i<=3;i++){
		arr[x]=i;
		dfs(x+1,sum+i);//其实就是10个for循环
		arr[x]=0;//恢复现场但是这题其实没必要
	}
}

main函数

点击查看代码
int main(){
	scanf("%d",&n);
	dfs(1,0);	
	cout<<rest<<'\n';
	for(int i=1;i<=rest;i++){
		for(int j=1;j<=10;j++){
			cout<<mem[i][j]<<" ";
		}
		cout<<'\n';
	}
	return 0;
}

也有更美观的代码:https://www.luogu.com.cn/article/2e0dit29
2026年11月5日21点04分

posted @ 2026-11-05 21:04  Dbodo  阅读(6)  评论(0)    收藏  举报