题目描述
猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和
现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案
输入输出格式
输入格式:
一行,n<=5000
输出格式:
第一行,方案总数
第二行至结束,10个数,表示每种配料所放的质量
按字典序排列。
如果没有符合要求的方法,就只要在第一行输出一个“0”
输入输出样例
输入样例#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
Thinking : 对于我这种假OJer,其实一直是在学习相关的知识,动手写的话真的连递归也很少,因为完全不知道怎么写递归,所以这次算一个小小的进步吧。对了,我们这周是期中考试周,15号我们就考完了,昨天去爬山了,下午晚上全部用来在Linux上配置Hadoop和Java,我死的时候一定要给我烧一个装有Ubuntu 16.04 ISO 的Kingston 16G U盘,祭奠我对Linux无法言喻的爱,口亨!
#include<iostream>
#include<cstdio>
using namespace std;
int a[10];
int n, sum;
void solve(int k) {
if (k == 10) {
int ans = 0;
for (int j = 0; j < 10; j++) {
ans += a[j];
}
if (ans == n) {
sum++;
}
return;
}
for (int i = 1; i <= 3; i++) {
a[k] = i;
solve(k + 1);
}
}
void NEWsolve(int k) {
if (k == 10) {
int ans = 0;
for (int j = 0; j < 10; j++) {
ans += a[j];
}
if (ans == n) {
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
printf("\n");
}
return;
}
for (int i = 1; i <= 3; i++) {
a[k] = i;
NEWsolve(k + 1);
}
}
int main() {
scanf("%d", &n);
if (n <= 0 || n > 30)
printf("0");
else {
//因为要先打印总次数,在打印所有可能,所以我递归了两次,而且这题暴力枚举也可以,就是10重循环,有兴趣的自己可以体验一下。我向大佬献上膝盖就好。
solve(0);
cout << sum << endl;
NEWsolve(0);
}
return 0;
}