可以用暴力的十个for循环嵌套QWQ
卡在递归上很久很久很久…
题目:
题目背景
猪猪hanke得到了一只鸡
题目描述
猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和
现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案
输入输出格式
输入格式:
一行,n < = 5000
输出格式:
第一行,方案总数
第二行至结束,10个数,表示每种配料所放的质量
按字典序排列。
如果没有符合要求的方法,就只要在第一行输出一个“0”
输入输出样例
输入样例#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
说明
枚举
分析:
- 写得low一点就是十个for嵌套,定义一个数组 food[10],每个数值从1取到3 。 最后判断数值之和与题目给的美味程度是否一致。
- 大量for循环存在时,就可以用递归表示。
- 递归: 要考虑它一共有几层,最后结束递归的依据是什么。
- 不可能精确到每次递归的结果都符合要求。所以要有一个判断条件
- …只能意会不能言传!
代码:
#include<iostream>
using namespace std;
int food[10],sum=0;
int output(int *p){
for(int i=0;i<10;++i){
cout<<*p<<" ";
p++;
}
cout<<endl;
}
int re(int total,int beg){
if(beg != 10){
for(int i=1;i<=3;++i){
food[beg]=i;
re(total-i,beg+1);
}
}
else if(total==0){
output(food);
sum++;
return 0;
}
else return 0;
}
int main(){
int n;
cin>>n;
re(n,0);
cout<<sum<<endl;
}
代码二 :恐惧的十连for
#include <cmath>
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <string>
#include <iomanip>
#include <ctime>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int a,x;
int i[10];
int main()
{
scanf("%d",&a);
for(i[0]=1;i[0]<=3;i[0]++)
for(i[1]=1;i[1]<=3;i[1]++)
for(i[2]=1;i[2]<=3;i[2]++)
for(i[3]=1;i[3]<=3;i[3]++)
for(i[4]=1;i[4]<=3;i[4]++)
for(i[5]=1;i[5]<=3;i[5]++)
for(i[6]=1;i[6]<=3;i[6]++)
for(i[7]=1;i[7]<=3;i[7]++)
for(i[8]=1;i[8]<=3;i[8]++)
for(i[9]=1;i[9]<=3;i[9]++)
{
if(i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8]+i[9]==a)
x++;
}
printf("%d\n",x);
for(i[0]=1;i[0]<=3;i[0]++)
for(i[1]=1;i[1]<=3;i[1]++)
for(i[2]=1;i[2]<=3;i[2]++)
for(i[3]=1;i[3]<=3;i[3]++)
for(i[4]=1;i[4]<=3;i[4]++)
for(i[5]=1;i[5]<=3;i[5]++)
for(i[6]=1;i[6]<=3;i[6]++)
for(i[7]=1;i[7]<=3;i[7]++)
for(i[8]=1;i[8]<=3;i[8]++)
for(i[9]=1;i[9]<=3;i[9]++)
{
if(i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8]+i[9]==a)
{
for(int j=0;j<10;j++)
printf("%d ",i[j]);
printf("\n");
}
}
return 0;
}