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分

浙公网安备 33010602011771号