题目背景
猪猪 Hanke 得到了一只鸡。
题目描述
猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 1010 种配料(芥末、孜然等),每种配料可以放 11 到 33 克,任意烤鸡的美味程度为所有配料质量之和。
现在, Hanke 想要知道,如果给你一个美味程度 nn ,请输出这 1010 种配料的所有搭配方案。
输入格式
一个正整数 nn,表示美味程度。
输出格式
第一行,方案总数。
第二行至结束,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
说明/提示
对于 100\%100% 的数据,n \leq 5000n≤5000。
分析:
很惭愧,我对这题几乎不知道该如何去写,我只知道美味程度大于30或者小于10,是没有结果的
至于其他的,我的想法很简单,先每个调料分一个,然后剩下的从最后一个开始分,直到分完为止,然后还在想怎么用全排列,但显然,我想的太复杂了,暴力穷举,就是用最简单的方法,来解答,如果只有两个调料,你会怎么办,会二重循环,每次1-3克,那是个调料,就十重循环即可,当我第一次在题解里看到这个代码时,我真的震惊了,这才是暴力穷举法的本质啊,膜拜....
附上AC代码:
#include<iostream>
using namespace std;
int delicious;
int sum=0;
int ans[100005][11];
int main()
{
cin>>delicious;
for(int t1=1;t1<=3;t1++)
for(int t2=1;t2<=3;t2++)
for(int t3=1;t3<=3;t3++)
for(int t4=1;t4<=3;t4++)
for(int t5=1;t5<=3;t5++)
for(int t6=1;t6<=3;t6++)
for(int t7=1;t7<=3;t7++)
for(int t8=1;t8<=3;t8++)
for(int t9=1;t9<=3;t9++)
for(int t10=1;t10<=3;t10++)
{
if(t1+t2+t3+t4+t5+t6+t7+t8+t9+t10==delicious)
{
sum++;
ans[sum][1]=t1;
ans[sum][2]=t2;
ans[sum][3]=t3;
ans[sum][4]=t4;
ans[sum][5]=t5;
ans[sum][6]=t6;
ans[sum][7]=t7;
ans[sum][8]=t8;
ans[sum][9]=t9;
ans[sum][10]=t10;
}
}
if(sum==0)
cout<<0;
else
{
cout<<sum<<endl;
for(int i=1;i<=sum;i++)
cout<<ans[i][1]<<" "<<ans[i][2]<<" "<<ans[i][3]<<" "<<ans[i][4]<<" "<<ans[i][5]
<<" "<<ans[i][6]<<" "<<ans[i][7]<<" "<<ans[i][8]<<" "<<ans[i][9]<<" "<<ans[i][10]<<endl;
}
return 0;
}