基础1暴力之枚举

深度优先搜索(DFS,Depth-First Search)是搜索手段之一。它从某个状态开始,不断的转移状态知道无法转移,然后退回到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。

问题给定整数a1,a2...an,判断是否可以从中选出若干数,使它们的和恰好为k。

1<=n<=20

-1e8<=ai<=10e8

-1e8<=k<=1e8

输入:

n=4 k=13

a={1 2 4 7}

输出:

Yes (13 = 2 + 4 + 7)

输入:

n=4 k=15

a={1 2 4 7}

输出:

No

枚举每一种情况复杂度为O(2^n)。利用dfs搜索可以枚举每一种情况代码如下:

#include <iostream>
#include<stack>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <math.h>
using namespace std;
#define pi acos(-1)
const int N=1e5;
int n,a[N],ans[N],k;
int h=0;
bool dfs(int i,int sum)//i代表第i个数(从0开始)
{
    if(i==n)  return sum==k;
    if(dfs(i+1,sum+a[i])) //加入a[i]往下递归
    {
        ans[h++]=a[i];
        return true;
    }
    if(dfs(i+1,sum))//不加a[i]往下递归  可以看成是加不加a[i]的问题(包括了所有状态)
    {
        return true;
    }
    return false;
}
int main()
{
    int i,j;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        h=0;
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        if(dfs(0,0))
        {
            printf("Yes (%d =",k);
            for(i=0; i<h; i++)
            {
                printf(" %d",ans[i]);
                if(i!=h-1)
                    printf(" +");
            }
            printf(")\n");
        }
        else
            printf("No\n");
    }
    return 0;
}

  

时间: 2024-08-07 12:31:44

基础1暴力之枚举的相关文章

基础算法之二——枚举法

基础算法之二--枚举法"赛利的硬币" 题目描述 赛利有 12枚银币.其中有 11枚真币和1枚假币.假币看起来和真币没有区别,但是重量不同.但赛利不知道假币比真币轻还是重.于是他向朋友借了一架天平.朋友希望赛利称三次就能找出假币并且确定假币是轻是重.例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的.如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币.经过精心安排每次的称量,赛利保证在称三次后确定假币. 输入数据 输入有三行,每行表示一次称量的结果.赛利事先

C#语言基础——结构体和枚举类型

结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承. 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.这可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异. 结构体是一个变量组,将一组变量放在一起,

HDU 4277 USACO ORZ(暴力+双向枚举)

USACO ORZ Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3809    Accepted Submission(s): 1264 Problem Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastu

2016.8.3 C#基础 结构体,枚举类型

结构体-枚举类型 一.枚举类型 枚举(enum)是值类型的一种特殊形式,它从System.Enum继承而来,并为基础类型的值提供替代名称.枚举类型有名称.基础类型和一组字段.基础类型必须是一个除char 类型外的内置的有符号(或无符号)整数类型(如Byte.Int32或UInt64).也可以说,枚举类型是一组常量的集合. 1.定义:Enum....{E} 枚举元素的默认基础类型为int.默认情况下,第一个枚举数的值为0,后面每个枚举数的值依次递增1.例如: enum meiju://枚举是常量的

c#基础 结构体、枚举类型

结构体 ~struct 定义: 结构体一般定义在Main函数上面,位于Class下面,作为一个类:一般情况Struct定义在Main函数前面,Main函数里面的地方都可以使用,参数前面加上public代表公用变量. 格式: struct +结构体的名称 { public int+变量名; public double+变量名: public string+变量名: } 以上就是定义一个结构体的格式,里面包含许多种数据类型,如整形int,字符串string,带小数点decimal等: 用法: (1)

暴力的枚举法[奥数等式]

将数字1~9分别填入,每个数字只能使用一次使得等式成立.例如173+286=459就是一个合理的组合,请问一共有多少种合理的组合?注意173+286=459和286+173=459是同一种组合. 根据枚举思想我们只需要枚举每一位上所有可能的数就好了.用一个book数组来标记解决互不相等的问题. 由于173+286=459和286+173=459是同一种组合,所以结果total/2. 暴力枚举简单暴力,但是时间复杂度很高,枚举算法也叫穷举算法,基本思想就是有序的去尝试每一种可能.

903A. Hungry Student Problem#饥饿的学生(暴力&amp;双层枚举)

题目出处:http://codeforces.com/problemset/problem/903/A 题目大意就是:一个数能否用正整数个另外两个数合成 #include<iostream> using namespace std; //双重枚举 int main(){ int n;cin>>n; while(n--){ int temp; cin>>temp; int flag = 1; for(int i=0; i<100/3; i++){ for(int j

java基础篇2之枚举

1.为什么要有枚举 问题:要定义星期几或者性别的变量,该怎么定义? 假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0; 枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错, 枚举可以让编译器在编译时就可以控制源程序中填写的非法制,普通变量的方式在开发阶段无法实现这一目标 2.用普通类如何实现枚举功能,定义一个WeekDay的类来模拟枚举功能 - 私有的构造方法 - 每个元素分别用一个公有的静态成员变量表示 - 可以有弱冠公有方法或者抽象方

恶补ASP.NET基础【1】枚举和结构

有时我们希望变量提取的是一个固定集合中的值,此时就可以用枚举类型, 例: enum OpenMode : byte { 新增=1, 编辑=2, 查看=3 } class Program { static void Main(string[] args) { OpenMode openMode = OpenMode.新增; Console.WriteLine("myOrientation = {0}", openMode); Console.ReadKey(); } } 打印结果是打出了