dfs第二遍重学

---恢复内容开始---

    1.先上个基础的全排列

    

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1e3;
int vis[maxn];
int p[maxn];
int n;
int t=0;
void dfs(int x)
{
    if(x==n+1)
    {
        for(int i=1;i<=n;i++)
            cout<<p[i]<<" ";
            cout<<endl;
            return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            vis[i]=1;
            p[x]=i;
            dfs(x+1);
            vis[i]=0;
        }
    }
}
int main()
{
    while(cin>>n)
    {
        memset(vis,0,sizeof(vis));
        dfs(1);
    }
}

    2.  HDU2614

      这是个什么鬼题,依然不太明白题意,Hint部分还带有误导性。反正就是尽量让解题时间变长,找最长解题数目。对于Tij,如果符合条件,vis[j]通通不能再用。。。。但是代码是很简单,基本的dfs模板操作。

      

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=20;
int e[maxn][maxn];
int vis[maxn*maxn];
int ans;
int k,n;
void dfs(int now,int time,int k)
{
    for(int i=0;i<n;i++)
    {
        if(!vis[i]&&e[now][i]>=time)
        {
            vis[i]=1;
            dfs(i,e[now][i],k+1);
            vis[i]=0;
        }
    }
    ans=max(ans,k);
}
int main()
{
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                cin>>e[i][j];
        memset(vis,0,sizeof(vis));
        vis[0]=1;
        ans=1;
        dfs(0,0,1);
        cout<<ans<<endl;
    }
}

5974: 【递归入门】组合+判断素数

    

题目描述

已知 n 个整数b1,b2,…,bn

以及一个整数 k(k<n)。

从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。

例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
    3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。
  现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29。

输入

第一行两个整数:n , k (1<=n<=20,k<n) 
第二行n个整数:x1,x2,…,xn (1<=xi<=5000000)

输出

一个整数(满足条件的方案数)。

样例输入

4 3
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=200;
int vis[maxn];
int a[maxn];
int num[maxn];
int n,k;
int ans=0;
int sum=0;
int ac(int x)
{
    if(x<=1)
        return 0;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
            return 0;
    }
    return 1;
}
void dfs(int ind)
{
    if(ind==k+1)
    {
        if(ac(sum))
            ans++;
    /*    for(int i=1;i<=k;i++)
            cout<<num[i]<<" ";*/
            cout<<endl;
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(!vis[i]&&i>num[ind-1])
        {
            sum+=a[i];
            num[ind]=i;
            vis[i]=1;
            dfs(ind+1);
            vis[i]=0;
            sum-=a[i];
        }
    }
}
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        num[i]=i;
    }
    dfs(1);
    cout<<ans<<endl;
    return 0;
}
3 7 12 19

样例输出

1      dfs入门题  第一次T了,因为会出现重复计算,效率低。所以参照题解加入了num数组,进行下标记录,i>num[ind-1],保证方向是正向的。sum记得加完在减掉回溯。    

原文地址:https://www.cnblogs.com/liyexin/p/11668398.html

时间: 2024-10-14 00:48:18

dfs第二遍重学的相关文章

重学计算机组成原理(二)- 制定学习路线,攀登“性能”之巅

0 学习路线的知识点概括 学习计算机组成原理,就是学习计算机是如何协调运行的 计算机组成原理的英文叫Computer Organization Organization 意"组织机构". 该组织机构能够进行各种计算.控制.读取输入,进行输出,达成各种强大的功能. 把整个计算机组成原理的知识点拆分成了四大部分 计算机的基本组成 计算机的指令和计算 处理器设计 存储器和I/O设备. 0.1 计算机的基本组成 计算机的硬件组成 这些硬件,怎么对应到经典的冯·诺依曼体系结构的 除此之外,还需要

Python重学记录1

写下这个标题觉得可笑,其实本人2014年就自学过一次python,当时看的是中谷教育的milo老师的视频,也跟着写了一些代码,只是因为当时工作上用不到也就淡忘了.不过说实话当时的水平也很低下,本来也没学到个什么.当时看过的书有<和孩子一起学编程><可爱的python>等 现在由于要学机器学习,重拾python,时过境迁,当时python还是很小众的一门语言,网上的资料也较少,那时候还为到底学2.x还是3.x纠结了半天,在当时的环境下虽然3.x刚出来没多久,但似乎业界用2.x还是主流

重学Java(一):与《Java编程思想》的不解之缘

说起来非常惭愧,我在 2008 年的时候就接触了 Java,但一直到现在(2018 年 10 月 10 日),基础知识依然非常薄弱.用一句话自嘲就是:十年 IT 老兵,Java 菜鸡一枚. 于是,我想,不如静下心来,重新读一遍那些经典的 Java 技术书,并且没读完一章就输出一篇原创技术文章.从哪一本开始呢?想了一想,还是从<Java 编程思想>开始吧!毕竟这本书赢得了全球程序员的广泛赞誉,从 Java 的基础语法到最高级特性,都能指导我们 Java 程序员轻松掌握. 记得刚上大学那会,就买了

重学ps_1

1,选取 打开图片->点击选取工具->ctrl+c->ctrl+n->ctrl+v 2,去除图片背景 打开你要去除背景的图片->在图层面板中->双击图层把图层改为0层->用魔棒点击背景->然后点击delete键->最后将图片存储为png格式 如果存为jpg他会默认添加背景 3,改变图片上文字的颜色 打开要改变的图片->选择快速工具->在你要改变的文字上点击一下->然后在点击油漆桶工具->在选择你想要改变的颜色->然后点击文

重学html

html是描述网页结构的标记语言. 1.html中标记是由尖括号和标记名组成,例如:<h1>,一个元素是指开始标记.闭合标记和他们之间的内容组成,例如:<h1>北京</h1> 2.很多时候,我们用html创建的网页在浏览器中运行的时候,会利用浏览器自带的默认样式来表现结构. 3.css级联样式表,用来描述如何表现内容. <style type="text/css">   <!--type告诉浏览器你所使用的样式的种类--> &

重学线代——声明篇

为啥重学线代呢? 1.当初学得模棱两可,时间长了啥也没剩下 2.越来越发现线代很流弊,很有用(不只是线代,各门数学都有此感触) 3.比较巧合地在网络上发现了个很好的线代教学资源 4.假期浪费了太可惜了 你这堆博客要写点啥呢? 课程笔记.个人领悟.无知吐槽.等等等等 你还想说点啥么? 没了 哦 恩

重学C++ (1)

写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯乐赏识. 定的标题为“重学C++” 本人之前使用C++基本上用作算法编写,MFC界面的学习编写,集成OpencV进行图像处理的项目开发或者论文实验 总的来说,能处理基本问题.但是远不能达到灵活的地步.所以下载了两本书<effective C++>和<effective STL>我希望能

开始刷第二遍

从9月12号开始,到现在三个多月了,现在进度是300/304,后面几题难度比较大,尤其是dietpepsi加的一些Dynamic Programming的新题,自己往往做不出来要去看答案.今天起决定暂停做新题了,从头开始刷第二遍,之后的新题目,等到第二遍结束的时候再尝试挑战. 第二遍打算在两个月内刷完,研究Discuss版,争取每道题目能有最优解法和多种解法, 也要进行仔细和正确的复杂度分析,注意coding style以及coding convention.同时还要全面补强数据结构和算法的知识

C#&amp;java重学笔记(函数)

C#部分  1.写在函数定义的()中的关键字: a.params关键字:用来满足函数的参数为数组时,而数组的长度不固定的情况.且该关键字只能用来修饰数组型参数.这样一修饰,就达成了类似JavaScript函数书写参数的特点. b.ref关键字:让参数按引用传递,类似于C中的传指针参数.比如经典的数值交换函数,你传形参和传指针的结果应该知道,加了ref关键字就相当于传指针.注意:ref只接收变量做参数,你字面量怎么弄指针?而且该变量必须初始化!     c.out关键字:功能和ref一样,区别在于