解析:本题可以使用深搜DFS的方法。每次选配料时有3种选择方式,撒1克,2克,3克。
因为配料数已知,为10种,所以为了简化题目,我将输入的总配料减10克,将方式改为撒0克,1克,2克。(其实是一样的。。)
需要注意的是,本题还要求输出每个方法配料的具体情况。所以选用vec数组来保存,在DFS过程中传递上一个数组的拷贝
最后将结果保存到res二维数组中。
代码如下
#include <bits/stdc++.h>
using namespace std;
//存放每种方法的配料详情
vector<vector<int>> res;
vector<int> vec(10,1);
//n为需要放置的配料总重
int n;
int total = 0;
void dfs(int pos , int sum, int si, vector<int> v)
{
if(si == 1) v[pos-1]++;
if(si == 2) v[pos-1]+=2;
if(sum == n)
{
total ++;
res.push_back(v);
return ;
}
if(sum > n || pos == 10) return ;
dfs(pos+1,sum,0,v);
dfs(pos+1,sum+1,1,v);
dfs(pos+1,sum+2,2,v);
}
int main()
{
int nn;
cin>>nn;
n = nn - 10;
dfs(0,0,0,vec);
cout<<total<<endl;
for(int i = 0; i < res.size() ; i++)
{
for(int j = 0 ; j < 9 ; j++)
{
cout<<res[i][j]<<" ";
}
cout<<res[i][9]<<endl;
}
return 0;
}