• poj1564-Sum It Up(经典DFS)


    给出一个n,k,再给出的n个数中,输出所有的可能使几个数的和等于k

    Sample Input

    4 6 4 3 2 2 1 1
    5 3 2 1 1
    400 12 50 50 50 50 50 50 25 25 25 25 25 25
    0 0
    Sample Output

    Sums of 4:
    4
    3+1
    2+2
    2+1+1
    Sums of 5:
    NONE
    Sums of 400:
    50+50+50+50+50+50+25+25+25+25
    50+50+50+50+50+25+25+25+25+25+25

    明显的DFS,这个dfs方程让我纠结啊,递归的我头都大了,但是看下答案稍微来点灵感了,在这里dfs函数方程要有哪些参数?

    首先要从当前数往后开始dfs,所以要有个参数是当前搜索的数组下标

    其次,要判断和=t,所以还要有个保存当前的和的参数,在这里我用t减去当前和,所以当此参数等于0那么就是找到满足条件

    最后要输出此序列,所以还要有个参数来标记当前要找的数在数组里的位置

    找到三个参数后就好办多了,看代码吧

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    int n,t;
    int num[101];
    int r[101];
    bool flag;
    void dfs(int len,int k,int last)
    {
        int result;
        if(last==0)
        {
            flag=false;
            for(int i=0;i<len;i++)
            if(i==0)printf("%d",r[i]);
            else printf("+%d",r[i]);
            printf(" ");
            return ;
        }
        for(int i=k;i<n;i++)
         {
              
             if(i==k||num[i]!=num[i-1]&&last-num[i]>=0)// 去除重复的操作
             {
             r[len]=num[i];
             dfs(len+1,i+1,last-num[i]);
             }      
         }
    }
    int main()
    {
        while(scanf("%d%d",&t,&n)!=EOF)
        {
            if(t==n&&n==0)break;
            flag=true;
            for(int i=0;i<n;i++)
            scanf("%d",&num[i]);
            printf("Sums of %d: ", t);
            dfs(0,0,t);
            if(flag)printf("NONE ");
        }
         
    }
  • 相关阅读:
    快排原理讲解
    Kafka原理详解
    java中的基本数据类型转换
    centos7关闭防火墙
    安装Linux基本工具
    Kibana笔记
    虚拟机配置net模式
    2019-10-12,html+php+mysql简单留言板,作业
    2019-10-11:渗透测试,基础学习,php+mysql连接,笔记
    2019-10-10:渗透测试,基础学习,mysql语法基础,笔记
  • 原文地址:https://www.cnblogs.com/to-creat/p/4968359.html
Copyright © 2020-2023  润新知