洛谷P2089烤鸡

本文介绍了如何通过深度优先搜索(DFS)算法解决一道涉及6个变量的编程题,目标是找到美味程度为目标值的所有调料组合及其数量。作者提供了C++代码示例,展示了从第一个调料开始遍历并计算符合条件的方案的过程。
摘要由CSDN通过智能技术生成

        这道题正解是枚举,歪解是DFS。所以我用DFS解一下。

        这道题涉及了6个变量,我分别介绍一下:

n:就是目标美味程度。

num:用来记录当前的各个调料质量

ans:方案的总数

ans2:用来记录所有符合题意的每个方案的各个调料的质量

flag:当前操作的调料的编号

sum:实际的美味程度,也就是各调料质量之和

由于本题是输出格式是先输出方案的总数(ans)再输出的方案内具体各个调料的质量,所以要把每个符合的num整合到ans2中。

        废话不多说,直接上代码讲解。

        

#include "iostream"
using namespace std;
int n,num[15],ans,ans2[60000][15];
void dfs(int flag,int sum){
    if (flag>10){//如果对十个调料都操作过之后就要判断是否符合题意了
        if (sum==n){//符合题意
            ans++;//方案数加一
            for(int i=1;i<=10;i++)ans2[ans][i]=num[i];//将num数组存入ans2中
        }
        return;//return掉
    }
    for(int i=1;i<=3;i++){对调料调料的质量进行遍历,每个调料有3个选择
        if(sum+i>n)break;//如果调料质量之和加上当前调料的质量如果大于n也就没有必要继续往下了
        num[flag]=i;//将当前操作的调料的质量记录到num中
        dfs(flag+1,sum+i);//对下一个调料进行遍历操作
        num[flag]=0;//回溯一下,可有可无,因为再次下次搜索时新的i会将旧的i值覆盖
    }
}
int main(){
    cin>>n;
    dfs(1,0);
//dfs调用从第一个调料的质量开始操作
    cout<<ans<<endl;
//最后输出ans和各个方案
    for(int i=1;i<=ans;i++){
        for(int j=1;j<=10;j++)cout<<ans2[i][j]<<" ";
        cout<<endl;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值