题目
原题地址
题目背景
猪猪hanke得到了一只鸡
题目描述
猪猪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
说明
枚举
题解
本来是想拿递归写子集生成的,写到一半发现这题要先保存结果然后输出答案,然后我就懵逼了:我在最后面一层递归验证完了答案以后怎么获取上一层的数据放到结果集?一时没想出来,就拿10连for做了(蠢。。。。
突然心痛,我感觉我的智商变低了(虽然本来就不高。。。
代码
#include <iostream>
using namespace std;
int resultCount = 0;
int resultSquare[10000][10];
int main(int argc, const char * argv[]) {
int n = -1;
cin >> n;
if((n > 30) || (n < 10)){
cout << "0" << endl;
return 0;
}
for(int num0 = 1; num0 <= 3; num0++)
for(int num1 = 1; num1 <= 3; num1++)
for(int num2 = 1; num2 <= 3; num2++)
for(int num3 = 1; num3 <= 3; num3++)
for(int num4 = 1; num4 <= 3; num4++)
for(int num5 = 1; num5 <= 3; num5++)
for(int num6 = 1; num6 <= 3; num6++)
for(int num7 = 1; num7 <= 3; num7++)
for(int num8 = 1; num8 <= 3; num8++)
for(int num9 = 1; num9 <= 3; num9++){
if((num0+num1+num2+num3+num4+num5+num6+num7+num8+num9) == n){
resultSquare[resultCount][0] = num0;
resultSquare[resultCount][1] = num1;
resultSquare[resultCount][2] = num2;
resultSquare[resultCount][3] = num3;
resultSquare[resultCount][4] = num4;
resultSquare[resultCount][5] = num5;
resultSquare[resultCount][6] = num6;
resultSquare[resultCount][7] = num7;
resultSquare[resultCount][8] = num8;
resultSquare[resultCount][9] = num9;
resultCount++;
}
}
cout << resultCount << endl;
for(int countO = 0; countO < resultCount; countO++)
for(int countI = 0; countI < 10; countI++){
if(countI == 9)
cout << resultSquare[countO][countI] << endl;
else
cout << resultSquare[countO][countI] << " ";
}
return 0;
}