深度优先DFS-----例3 例4

例3:组合问题

输出m个数中取n个数的所有组合。例如m=5,n=3的所有组合为:
1      2      3
1      2      4
1      2      5
1      3      4
1      3      5
1      4      5
2      3      4
2      3      5
2      4      5
3      4      5

#include<iostream>
using namespace std;

int m,n,a[10];  //存放每个数
void comb(int k)
{      for (int i=a[k-1]+1; i<=m-n+k; i++)
       {     a[k]=i;
         if ( k>n )
              {      for (int i=1; i<=n;i++) printf("%5d",a[i]);
          printf("\n");          return;
               }
         comb(k+1);
        }
}
int main( )
{    scanf("%d%d",&m,&n);
    comb(1);  //从第1个数开始
 }

#include<iostream> using namespace std;

int m,n,a[10];  //存放每个数

void comb(int k)

{

for (int i=a[k-1]+1; i<=m-n+k; i++)

{     a[k]=i;

if ( k>n )

{             for (int i=1; i<=n;i++)        printf("%5d",a[i]);

printf("\n");          return;

}

comb(k+1);

}

}

int main( )

{

scanf("%d%d",&m,&n);

comb(1);  //从第1个数开始

}

 例4:0-1背包问题回溯求解

有不同价值、不同重量的物品n件,

求从这n件物品中选取一部分物品的选择方案,

使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。

例如:设限制重量为7,现有4件物品,它们的重量和价值见下表,问如何物品的价值之和最大?

// 0-1背包问题的回溯算法:
#include <stdio.h>
#define M 10
int w[M]={5,3,2,1}, v[M]={4,4,3,1}, limit_w=7, n=4;
int   tw=0, maxv=0, tv=0, b[M]={0} ;
void find(int i)
{    if (i==n) return;    //已对所有物品作了判断
    if (tw+w[i]<=limit_w )   //选择第i件物品
        if (i<=n-1)    //进入第i+1件的条件
        {    tw=tw+w[i]; tv=tv+v[i]; b[i]=1; //选了第i件
        if (maxv<tv)  maxv=tv;
        find(i+1); //进入第i+1件
        tw=tw-w[i]; tv=tv-v[i]; b[i]=0;   //不选第i件了
        }
     if (i<=n-1) find(i+1);  //不选择第i件物品
}
void main( )
{    find(0); //从第0件物品开始选择
    printf("maxv=%d\n",maxv);  }

// 0-1背包问题的回溯算法:
#include <stdio.h>
#define M 10
int w[M]={5,3,2,1}, v[M]={4,4,3,1}, limit_w=7, n=4;

int   tw=0, maxv=0, tv=0, b[M]={0} ;

void find(int i)  
{ if (i==n) return;    //已对所有物品作了判断
 if (tw+w[i]<=limit_w )   //选择第i件物品
     if (i<=n-1)    //进入第i+1件的条件

{             tw=tw+w[i];          tv=tv+v[i];           b[i]=1;  //选了第i件
  if (maxv<tv)               maxv=tv;
                    find(i+1); //进入第i+1件
  tw=tw-w[i];               tv=tv-v[i];        b[i]=0;    //不选第i件了
     }

if (i<=n-1) find(i+1);  //不选择第i件物品
}

void main( )
{             find(0); //从第0件物品开始选择

printf("maxv=%d\n",maxv);                  }

深度优先DFS-----例3 例4,布布扣,bubuko.com

时间: 2024-10-25 15:25:11

深度优先DFS-----例3 例4的相关文章

深度优先DFS

深度优先(DFS)模板1: void   DFS(int k)             //处理第k步{   if  (k==n)                              //已经处理到第n步,到达目的状态                 输出结果    else                               //处理第k步          for (int i=1; i<=m; i++)            //第k步中有m种可能          {   

单例多例

单例多例需要搞明白两个问题:1. 什么是单例多例:2. 如何产生单例多例:3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例:1. 什么是单例多例:所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 2. 如何产生单例多例:    在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype"; 3. 为

web 单例 多例

单例多例需要搞明白两个问题:1. 什么是单例多例:2. 如何产生单例多例:3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例:1. 什么是单例多例:所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 2. 如何产生单例多例:    在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype"; 3. 为

Spring中构造器、init-method、@PostConstruct、afterPropertiesSet孰先孰后,自动注入发生时间以及单例多例的区别

首先明白,spring的IOC功能需要是利用反射原理,反射获取类的无参构造方法创建对象,如果一个类没有无参的构造方法spring是不会创建对象的.在这里需要提醒一下,如果我们在class中没有显示的声明构造方法,默认会生成一个无参构造方法,但是当我们显示的声明一个有参构造方法的时候,JVM不会帮我们生成无参构造方法,所以我们声明一个带参数的构造方法也需要声明一个无参构造方法.(题外话:如果父类声明一个有参构造方法,子类需要在构造方法第一行显示的调用父类构造方法,因为子类的对象也是父类的对象,所以

Spring中单例多例面试题分析

面试题 1.Spring是单例还是多例,怎么修改? Spring的bean默认是单例的(sigleton)可以修改为多例(prototype), 在此bean节点中添加一个属性,scope="prototype"; 例如<bean id="xxx" class="全类名" scope="prototype"></bean> <?xml version="1.0" encodin

单例—单例—单例 初始化方法

//单例的空间在整个程序运行的时候都不会被回收, 因此户存在内存泄露的情况, 他的存在是为了解决特定问题 ?初级 + (Singleton *)mainSingleton { //静态变量 static Singleton *single = nil; if (!single) { single = [[Singleton alloc]init]; } return single; } ?终极 + (id)defaultManager { //静态变量 static DatabaseManage

c语言 深度优先 DFS

1 #include <stdio.h> 2 /* 3 输入一个数n,输出1~n的全排列,有多少种不同的排列? 4 //暴力枚举当然可以,写判断累死.for循环嵌套起来也是累. 5 6 这里运用的是depth first search,DFS 深度优先搜索的思想 7 装作n对应的是n张扑克牌,将其放入n个盒子里有多少种排列方法. 8 */ 9 int a[10],book[10],n;//c语言的全局变量在没有赋值以前默认为0;因此哲理的book数组无需全部再次赋初始值0; 11 void d

对邻接链表的深度优先(DFS)遍历

深度优先搜索算法在搜索过程中对节点进行涂色来指明节点的当前状态. 每个节点的初始颜色都是白色. 在节点被发现后变成灰色. 在其邻接链表被扫描完成之后变成黑色. 该方法可以保证每个节点只在一棵深度优先树中出现, 因此, 所有的深度优先树是不相交(disjoint)的. 除了创建深度优先搜索森林之外, 该方法还在每个节点盖上两个时间戳. 一个是被发现的时间(涂上灰色的时间), 另一个是完成对v的邻接链表扫描的时间(涂上黑色的时间). 这些时间戳提供了图的结构的重要信息. 当DFS算法返回时, 每个顶

struts2的单例多例问题

我想大家都知道struts2默认就是多例的,而spring默认都是例的,如果二者集成,那action会是单例还是多例呢? 首先我们先回顾一下struts2和spring的两种整合方式: 1. 由spring来创建和管理action,即在action上增加@Controller注解,如果是xml方式的话,就是在spring中增加action的配置,而在struts2的xml中,配置的class的直接指向spring中的配置类,如 <bean id="LoginAction" cla

简单多线程和单例学习例一

这是一个简单的面试题: 写一个简单的单例和多线程结合的例子; 代码: 单例代码: public class Singleton { private int i = 0; //在类内部实例化单例, 将会在虚拟机启动加载类的时候加载该静态实例 private static Singleton singleton = new Singleton(); //自由化构造函数,以确保不会被外部类实例化 private Singleton() { System.out.println("初始化单例!"