题目描述
猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 种配料(芥末、孜然等),每种配料可以放 到 克,任意烤鸡的美味程度为所有配料质量之和。
现在, Hanke 想要知道,如果给你一个美味程度 ,请输出这 种配料的所有搭配方案。
数据分析
输入
11
输出
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<bits/stdc++.h>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
for(int a=1;a<=3;a++)
for(int b=1;b<=3;b++)
for(int c=1;c<=3;c++)
for(int d=1;d<=3;d++)
for(int e=1;e<=3;e++)
for(int f=1;f<=3;f++)
for(int g=1;g<=3;g++)
for(int h=1;h<=3;h++)
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++){
if(a+b+c+d+e+f+g+h+i+j!=n)continue;
else ans++;
}
cout<<ans<<endl;
for(int a=1;a<=3;a++)
for(int b=1;b<=3;b++)
for(int c=1;c<=3;c++)
for(int d=1;d<=3;d++)
for(int e=1;e<=3;e++)
for(int f=1;f<=3;f++)
for(int g=1;g<=3;g++)
for(int h=1;h<=3;h++)
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++){
if(a+b+c+d+e+f+g+h+i+j!=n)continue;
else cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<g<<" "<<h<<" "<<i<<" "<<j<<endl;
}
return 0;
}
我们还可以再优化一下。for循环码量太大,用define语句宏定义一下。并且我们建立一个二维数组,把数据存储到里面。
#include<bits/stdc++.h>
#define forn(i) for(int i=1;i<=3;i++)
using namespace std;
int s[60000][10],n,ans;
int main(){
scanf("%d",&n);
forn(a)forn(b)forn(c)forn(d)forn(e)forn(f)forn(g)forn(h)forn(i)forn(j)
if(a+b+c+d+e+f+g+h+i+j!=n)continue;
else{
ans++;
s[ans][0]=a,s[ans][1]=b,s[ans][2]=c,s[ans][3]=d,s[ans][4]=e;
s[ans][5]=f,s[ans][6]=g,s[ans][7]=h,s[ans][8]=i,s[ans][9]=j;
}
printf("%d\n",ans);
for(int i=1;i<=ans;i++)
for(int j=0;j<10;j++)cout<<s[i][j]<<(j!=9?" ":"\n");
return 0;
}
如有不足,欢迎大家指正补充。