L3-001 凑零钱 [DFS]
核心思路dfs,不知道要写什么,复制一段DFS思想好了。
深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问。
沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }