题目背景
猪猪 Hanke 得到了一只鸡。
题目描述
猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 1010 种配料(芥末、孜然等),每种配料可以放 11 到 33 克,任意烤鸡的美味程度为所有配料质量之和。
现在, Hanke 想要知道,如果给你一个美味程度 �n ,请输出这 1010 种配料的所有搭配方案。
输入格式
一个正整数 �n,表示美味程度。
输出格式
第一行,方案总数。
第二行至结束,1010 个数,表示每种配料所放的质量,按字典序排列。
如果没有符合要求的方法,就只要在第一行输出一个 00。
输入输出样例
输入 #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
解题过程:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n; //调料总质量
int arr[20]; //数组存临时方案,总共10种调料,20肯定不会超
int res = 0; //存方案数
int num[59049][20]; //存所有方案
void dfs(int x,int sum){//x为调料的种类,sum为选择调料的总质量
if(sum>n) return; //剪枝
if(x>10){ //保证10种调料都已经考虑过了
if(sum == n){
res++;
for(int i=1; i<=10; i++){
num[res][i] = arr[i];
}
}
return;
}
for(int i=1; i<=3; i++){
arr[x] = i; //考虑调料的种类,遍历3种可能的质量
dfs(x+1,sum+i); // 遍历所有种类的调料
arr[x] = 0; //回溯
}
}
int main(){
scanf("%d",&n);
dfs(1,0); //从第一种调料开始,初始质量为0
printf("%d\n",res); // 输出所有的方案数
for(int i=1; i<=res; i++){
for(int j=1; j<=10; j++){
printf("%d ",num[i][j]);
}
printf("\n");
}
return 0;
}