首页 > 其他分享 >魔法甜点之和:小包的新挑战 | 回溯法

魔法甜点之和:小包的新挑战 | 回溯法

时间:2024-11-03 08:50:04浏览次数:7  
标签:like 喜爱 魔法 样例 甜点 回溯 include

问题描述

小R不再追求甜点中最高的喜爱值,今天他想要的是甜点喜爱值之和正好匹配他的预期值 S。为了达到这个目标,他可以使用魔法棒来改变甜点的喜爱值,使其变为原来喜爱值的阶乘。每个甜点只能使用一次魔法棒,也可以完全不用。

下午茶小哥今天带来了 N 个甜点,每个甜点都有一个固定的喜爱值。小R有 M 个魔法棒,他可以选择任意甜点使用,但每个甜点只能使用一次魔法棒。他的目标是通过选择一些甜点,可能使用魔法棒,使得这些甜点的喜爱值之和恰好为 S。

请计算小R有多少种不同的方案满足他的要求。如果两种方案中,选择的甜点不同,或者使用魔法棒的甜点不同,则视为不同的方案。


测试样例

样例1:

输入:n = 3, m = 2, s = 6, like = [1, 2, 3]
输出:5

样例2:

输入:n = 3, m = 1, s = 1, like = [1, 1, 1]
输出:6

样例3:

输入:n = 5, m = 3, s = 24, like = [1, 2, 3, 4, 5]
输出:1

样例4:

输入:n = 4, m = 0, s = 10, like = [1, 3, 3, 3]
输出:1

样例5:

输入:n = 6, m = 1, s = 35, like = [5, 5, 5, 5, 5, 5]
输出:0

题解:

        对于数组like中任意一个元素,有四种选择:选择,不选,用魔法棒选,用魔法棒不选。但是题目说明不能用魔法棒但不选,所以只有三种方式。直接暴力DFS即可。

        再说一下退出条件,当满足条件返回,所有元素遍历完返回,魔法棒用完返回,以及所选value>s返回。

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include <functional>
using namespace std;
typedef long long ll;

int sum=0;

ll jie(int x){
    int i=0;
    ll sum=1;
    for(i=1;i<=x;i++){
        sum*=i;
    }
    return sum;
}

void dfs(int i,int n,int m,int s,vector<int> like){
    //cout << i << " " << n << " " << m << " " << s << "\n";
    if(s==0 && m>=0 && i<=n){
        sum++;
        //cout << "YES " << i << "\n";
        return;
    }
    if(s<0){
        //cout << "1"<<"\n";
        return;

    }
    if(m<0){
        //cout << "2" << "\n";
        return;

    }
    if(i==n){
        //cout << "3" << "\n";
        return;

    }
    //不用但选
    dfs(i+1,n,m,s-like[i],like);
    //不用不选
    dfs(i+1,n,m,s,like);
    //用不选
    //dfs(i+1,n,m-1,s,like);
    //用选
    dfs(i+1,n,m-1,s-jie(like[i]),like);
}

int solution(int n, int m, int s, std::vector<int> like) {
    sum=0;
    // Please write your code here
    dfs(0,n,m,s,like);
    //cout << sum << "\n";
    return sum;
}

int main() {
    //  You can add more test cases here
    std::vector<int> like1 = {1, 2, 3};
    std::vector<int> like2 = {1, 1, 1};

    std::cout << (solution(3, 2, 6, like1) == 5) << std::endl;
    std::cout << (solution(3, 1, 1, like2) == 6) << std::endl;

    return 0;
}

标签:like,喜爱,魔法,样例,甜点,回溯,include
From: https://blog.csdn.net/2301_78848414/article/details/143460758

相关文章

  • 回溯法1
    给定一个含n个整数的数组nums(1≤n≤20,0≤nums[i]≤1000)和一个整数s(-1000≤s≤1000)。向数组中的每个整数前添加'+'或'-',然后串联起所有整数,可以构造一个表达式,例如,nums={2,1},可以在2之前添加'+',在1之前添加'-',然后串联起来得到表达式"+2-1"。输出满足条件的解的式子。  设计一......
  • ”回溯算法“框架及练习题
    @目录一、回溯算法是什么?二、框架如下:本人其他文章链接一、回溯算法是什么?结论:回溯=穷举解决一个回溯问题,实际上就是一个决策树的遍历过程路径:就是已经做出的选择选择列表:就是你当前可以做出的选择结束条件:就是basecase条件,也就是临界条件二、框架如下:框架如下:resu......
  • 算法设计与分析中的几个核心算法策略:动态规划、贪心算法、回溯算法和分治算法
    这些题目主要考察的是算法设计与分析中的几个核心算法策略:动态规划、贪心算法、回溯算法和分治算法。下面我将分别介绍这些知识点,并解析题目的详细解答过程。1.动态规划(DynamicProgramming,DP)知识点介绍:动态规划是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问......
  • Golang 开源库分享:anko - 给 Go 加点“脚本魔法”
    GitHub仓库链接:https://github.com/mattn/anko1.anko是干嘛用的?anko是一个可以让Go项目支持脚本语言的小工具。换句话说,就是我们可以给Go项目加点“脚本魔法”,在程序跑起来之后还能动态地改代码逻辑。比如,你在写一个应用,想让用户可以随时调整设置或控制程序的某些行为,而......
  • python使用魔法函数__getitem__实现字典和列表式访问自定义类型
    起因想起C++可以实现运算符重载,以实现以数组的方式([])访问我们的类.我想要实现一个类,可以同时用类似于字典和就想到python能不能实现这个效果,而且显然是可以的,不然numpy是怎么实现属于自己的数组的?#期望实现效果classmyclass: passc=myclass()#像这样使用[]访......
  • 回溯——3,5升杯倒4升水
    目录名称接前面书上说数学浅谈最大公约数gcd(a,b)=x∗a+y∗bgcd(a,b)=x*a+y*bgcd(a,b)=x∗a+y∗bC(3,2)=6C(3,2)=6C(3,2)=6只要一杯8升水代码一般回溯方法的程序结构打印接前面递归的改造——间隔挑硬币打印所挑选......
  • 揭秘AI档案管理:让海量数据井然有序的魔法
    揭秘苏哒AI档案管理:让海量数据井然有序的魔法在这个信息爆炸的时代,无论是企业还是政府机构,每天都在产生大量的文档资料。如何高效地管理和利用这些信息资产成为了大家都在思考的难题。当今随着AI技术的发展,我们有了新的解决方案——苏哒智能可以通过AI技术来优化档案管理,不仅......
  • 【回溯算法】(第七篇)
    目录⼦集(medium)题目解析讲解算法原理编写代码找出所有⼦集的异或总和再求和(easy)题目解析讲解算法原理编写代码⼦集(medium)题目解析1.题目链接:.-力扣(LeetCode)2.题目描述给你⼀个整数数组nums,数组中的元素互不相同。返回该数组所有可能的⼦集(幂集)。解集不能包......
  • Python 的魔法搜索:如何用代码解锁淘宝商品关键字的神秘力量
    在淘宝这个充满奇迹的电商王国里,每一个商品关键字都像是一把古老的钥匙,能够解锁隐藏在茫茫商品海洋中的宝藏。今天,我们要讲述的是如何成为一名Python魔法师,用你的代码魔杖,施展搜索魔法,按关键字精准搜索商品,并获取它们的API数据。准备你的魔法工具箱:Python开发环境在这场......
  • 【数据结构与算法】《Java 算法宝典:探秘从排序到回溯的奇妙世界》
    目录标题:《Java算法宝典:探秘从排序到回溯的奇妙世界》一、排序算法1、冒泡排序2、选择排序3、插入排序4、快速排序5、归并排序二、查找算法1、线性查找2、二分查找三、递归算法四、动态规划五、图算法1.深度优先搜索(DFS)2.广度优先搜索(BFS)六、贪心算法七、分治算法......