L3-001 凑零钱 [DFS]

核心思路dfs,不知道要写什么,复制一段DFS思想好了。

深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问。
沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。

#include <iostream>
#include <string.h>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <math.h>
#include <queue>
#include <vector>
#define maxn 35
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n,m,s,p,flag;
int a[maxn],b[maxn],vis[maxn];
void DFS(int x)
{
    if(s>m)
        return;
    if(s==m)
    {
        flag=1;
        printf("%d",b[0]);
        for(int i=1;i<p;i++)
            printf(" %d",b[i]);
        printf("\n");
    }
    else
    {
        for(int i=x;i<n;i++)
        {
            if(!vis[i]&&!flag)
            {
                vis[i]=1;
                b[p++]=a[i];
                s+=a[i];
                DFS(x+1);
                s-=a[i];
                b[--p]=0;
                vis[i]=0;
            }
        }
    }
    
}
int main()
{
    int sum=0;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    if(sum<m)
    {
        printf("No Solution\n");
        return 0;
    }
    s=0;
    p=0;
    flag=0;
    memset(vis,0,sizeof(vis));
    sort(a,a+n);
    DFS(0);
    if(!flag)
        printf("No Solution\n");
    return 0;
    
}
View Code

 

posted on 2019-03-11 16:35  FTA_Macro  阅读(207)  评论(0编辑  收藏  举报

导航