题目一:
代码思路:
1、运用全排列模版代码把所有可能性都选出来,一个一个判断。
2、这里主要讲一个优化(代码里有部分没写,但依旧可以过,只是提一下):
根据题意10种配料每种最多放三克,那么判断美味指数如果大于30就直接输出0就好了
在递归种如果当前这个搭配的美味指数已经大于目标的美味指数就直接结束当前递归,表示结束了此种方案的继续搭配
这道题还有一个要先打印出搭配种数,就是要用一个数组把可能性存下来,要不然调用两次递归就会超时。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100],k[100000][10];
int t_sum = 0;
void f2(int pos,int t){
if(t == 10){
if(pos == n) {
for(int i = 0; i < 10; i++) k[t_sum][i] = a[i];
t_sum++;
}
return;
}
else if (pos>=n);
for(int i = 1; i <= 3; i++){
a[t] = i;
if(pos + i <= n){
f2(pos+i,t+1);
}
}
}
int main(){
cin >> n;
f2(0,0);
cout << t_sum << endl;
for(int i = 0; i < t_sum; i++){
for(int j = 0; j < 10; j++ ) cout << k[i][j] << " ";
cout << endl;
}
return 0;
}