首页 > 其他分享 >天梯赛练习题L3-001 凑零钱(dfs 爆搜)

天梯赛练习题L3-001 凑零钱(dfs 爆搜)

时间:2023-03-08 21:45:58浏览次数:56  
标签:练习题 const res LL 样例 dfs 001 sum

https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805054207279104

题目大意:

给定n个硬币,总共需要我们凑出m块钱。

问我们能凑出的硬币的最小字典序是什么?

可以的话输出最小的字典序数列,不可以的话输出 “No Solution”。
输入样例 1:
8 9
5 9 8 7 2 3 4 1
输出样例 1:
1 3 5
输入样例 2:
4 8
7 2 4 3
输出样例 2:
No Solution

我一开始感觉dp可以做,想半天只知道怎么凑数,不大知道怎么计算位置和实际的数量(改天再来想想dp能不能做

暴力做法:
这题对时间卡得有点狠,注意剪枝(我们只要一开始按从小到大的顺序排一下序,这样在进行深搜的时候,就可以保证一定是按照最小字典序的顺序在进行了,所以一旦出现答案,那这就是我们想要的那个

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18,MINN=-1e18;
const LL N=1e6+10,M=2023;
const LL mod=998244353;
const double PI=3.1415926535;
#define endl '\n'
LL n,m,a[N];
vector<LL> ans;
bool flag=false;
void dfs(LL idx,LL res)
{
    if(flag==true) return ;
    if(res==m)
    {
        flag=true;
        for(int i=0;i<ans.size();i++)
        {
            cout<<ans[i];
            if(i!=ans.size()-1) cout<<" ";
        }
        cout<<endl;
        return ;
    }
    if(idx>n||res>m) return ;

    if(res+a[idx]<=m)
    {
        ans.push_back(a[idx]);
        dfs(idx+1,res+a[idx]);
        ans.pop_back();
    }
    dfs(idx+1,res);
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n>>m;
        LL sum=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
        if(sum<m) cout<<"No Solution"<<endl;
        else if(sum==m)
        {
            sort(a+1,a+1+n);
            for(int i=1;i<=n;i++)
            {
                cout<<a[i];
                if(i!=n) cout<<" ";
            }
            cout<<endl;
        }
        else
        {
            sort(a+1,a+1+n);
            dfs(1,0);//从第一个数字开始,总和为0
            if(flag!=true) cout<<"No Solution"<<endl;
        }
    }
    return 0;
}

标签:练习题,const,res,LL,样例,dfs,001,sum
From: https://www.cnblogs.com/Vivian-0918/p/17196344.html

相关文章

  • AcWing 165. 小猫爬山(dfs)
    https://www.acwing.com/problem/content/167/一共N只小猫,每个缆车最大承重量为W。N只小猫的重量分别是C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过W。......
  • 【DFS】LeetCode 剑指 Offer 07. 重建二叉树
    题目链接剑指Offer07.重建二叉树思路递归建树,思路与【DFS】LeetCode105.从前序与中序遍历序列构造二叉树相同。代码classSolution{publicTreeNodebuild......
  • 4868. 数字替换(dfs,剪枝)
    https://www.acwing.com/problem/content/description/4871/似乎没什么好办法,只能暴搜了,bfs对于那么多状态的搜索容易tle(bfs会把所有状态都彻底搜索一遍,相比dfs不方便......
  • DFS
    DFS主要思想:1.终点,2.回溯。一、对于终点,我们要对其做一个特殊的处理也就是对结果的处理,处理完之后结束这一次的递归,即开始这一次递归的回溯二、回溯,有很多人都卡在这里。......
  • 天梯赛练习题L2-041 插松枝(模拟/贪心)
    https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582268930473984L2-041插松枝题目意思:人造松枝加工场的工人需要将各种尺寸的塑料松针插到松......
  • 天梯赛练习题L2-042 老板的作息表(模拟)
    https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582383141380096题目大意:给定n个工作的时间段,每个时间段都在00:00:00到23:59:59这个范围内......
  • 天梯赛练习题L2(026-027)
    ###L2-026小字辈#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18;constLLN=100020,M=4002;//un......
  • 【DFS】LeetCode 46. 全排列
    题目链接46.全排列思路本题是求排列问题.与组合问题不同的是,在排列问题中,不同的数字顺序被视为不同的排列,比如[1,2]与[2,1]是两种不同的排列。搜索树如下图所示,引......
  • 【DFS】LeetCode 90. 子集 II
    题目链接90.子集II思路去重方法与【DFS】LeetCode40.组合总和II思路相似代码classSolution{privateList<List<Integer>>result=newArrayList<>();......
  • Uoj228 基础数据结构练习题
    Uoj228最开始好像是在那个区间加区间\(\text{popcount}\)的题里看到有人提到这个题,就来写下。离联合省选还有26天,发了一上午呆。题意区间加区间开根区间和\(n,......