题目描述
猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 10 种配料(芥末、孜然等),每种配料可以放 1 到 3 克,任意烤鸡的美味程度为所有配料质量之和。
现在, Hanke 想要知道,如果给你一个美味程度 n ,请输出这 10 种配料的所有搭配方案。
输入格式
一个正整数 n,表示美味程度。
输出格式
第一行,方案总数。
第二行至结束,每行 10 个数,表示每种配料所放的质量,按字典序排列。
如果没有符合要求的方法,就只要在第一行输出一个 0。
(本题的数据较为严格,每行末不能有尾空格)
样例输入
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
问题提示
对于 100% 的数据,n<=5000。
解题思路:
这题比较简单,只需要建立一个二位数组和记和器,并且用dfs和模拟即可做出,如果有狠人也可以尝试直接用十重循环即可,总体来说这题较简单话不多说我们直接上代码!!!!
#include <bits/stdc++.h>
using namespace std;
int a[10000][1000],n,ans=0;
int rks[15];
void dfs(int cur)
{
if(cur>10)
{
int sum=0;
for(int i=1;i<=10;i++)
{
sum+=rks[i];
}
if(sum==n)
{
ans++;
for(int i=1;i<=10;i++)
{
a[ans][i]=rks[i];
}
}
return ;
}
for(int i=1;i<=3;i++)
{
rks[cur]=i;
dfs(cur+1);
}
}
int main()
{
cin >> n;
dfs(1);
cout << ans <<endl;
for(int i=1;i<=ans;i++)
{
for(int j=1;j<=9;j++)
{
cout << a[i][j]<<" ";
}
cout << a[i][10];
cout << endl;
}
}