烤鸡
题目背景
猪猪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
思路:典型的递归算法,可以用深搜写;
1.对于每一种配料有三种取1克,2克,3克;
2.如果从当前位置起全部取3克仍不能取完所有的,则直接停止;
3.对于n大于30或小于10的情况,直接排除;
实现:
1.用reans[n][m]代表第n种情况的第m种配料的克数;
2.以dfs(all,num)为原型,all指所剩的配料的克数,num指地集中配料;
3.用a[i]临时存储第i种配料的克数,ans存储一共有多少种情况;
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[15]={0},ans=0,reans[10005][15]={0};
bool t=0;
void dfs(int all,int num){
if(num==10&&all>=1&&all<=3){
for(int i=1;i<=9;i++){
reans[ans+1][i]=a[i];
}
reans[ans+1][10]=all;
ans++;
return;
}
if(num>=10||all<=0)return;
if(all>(11-num)*3)return;
a[num]=1;
dfs(all-1,num+1);
a[num]=2;
dfs(all-2,num+1);
a[num]=3;
dfs(all-3,num+1);
a[num]=0;
}
int main(){
cin>>n;
if(n>30||n<10){
cout<<'0'<<endl;
return 0;
}
dfs(n,1);
cout<<ans<<endl;
for(int i=1;i<=ans;i++){
for(int j=1;j<=10;j++){
printf("%d ",reans[i][j]);
}
printf("\n");
}
}
对于深搜来说,
1.合理剪枝;
2.边界明了;
3.防止递归爆栈。