P2089 烤鸡

可以用暴力的十个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]++)//疯狂的·壮观的十重for循环(猪猪Hanke:醉了)
                                        {
                                            if(i[0]+i[1]+i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8]+i[9]==a)//用x储存方案数
                                                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]++)//疯狂的·壮观的十重for循环x2(猪猪Hanke:醉了x2)
                                        {
                                            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");//换行
                                            }
                                        }
    /*system("pause");*///暂停个程序嘞(提交时要注释掉,不然就RE了)
    return 0;//庄严地结束程序
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值