Q:蒜头军开公司
#include<iostream>
using namespace std;
int task[12][12];
bool used[12];
int n;
int ans;
void dfs(int x,int t) {
if (x == n) {
if (t < ans)
ans = t;
return;
}
for (int i = 0; i < n; i++) {
if (!used[i]) {
used[i] = true;
dfs(x + 1, t + task[x][i]);
used[i] = false;
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> task[i][j];
}
}
ans = 20000;
dfs(0,0);
cout << ans;
return 0;
}
学习视频:15-抽象深度优先搜索视频讲解_哔哩哔哩_bilibili
Q:K个数的和
#include<iostream>
using namespace std;
int n, k, sum, ans;
int a[1000] = { 0 };
void dfs(int i, int cnt, int s) { //考虑到第几个数,选了多少数,累计和
if (i == n) {
if (cnt == k && s == sum)
ans++;
return;
}
dfs(i + 1, cnt, s);
dfs(i + 1, cnt + 1, s + a[i]);
}
int main() {
cin >> n >> k >> sum;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
ans = 0;
dfs(0, 0, 0);
cout << ans << '\n';
return 0;
}
考虑排列顺序:
#include<iostream>
using namespace std;
int n, k, sum;
int a[110];
int ans = 0;
bool vis[110];
void dfs(int cnt, int s) {
if (cnt == k) {
if (s == sum) {
ans++;
}
}
for (int i = 0; i < n; i++) {
if (!vis[i]) {
vis[i] = true;
dfs(cnt + 1, s + a[i]);
vis[i] = false;
}
}
}
int main() {
cin >> n >> k >> sum;
for (int i = 0; i < n; i++)
cin >> a[i];
dfs(0, 0);
cout << '\n' <<ans << endl;
return 0;
}
Q:等边三角形
#include<iostream>
using namespace std;
int n, sum = 0;
int p[12];
bool vis[12];
bool f;
void dfs(int cnt, int s, int pos) {
if (cnt == 3) {
f = true;
return;
}
if (s == sum / 3) {
dfs(cnt + 1, 0, 0);
}
for (int i = pos; i < n; i++) {
if (!vis[i]) {
vis[i] = true;
dfs(cnt, s + p[i], i + 1);
vis[i] = false;
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> p[i];
sum += p[i];
}
if (sum % 3) {
cout << "no" << '\n';
}
else {
dfs(0, 0, 0);
if (f)
cout << "yes" << '\n';
}
}
Q:N皇后
#include<iostream>
using namespace std;
int h[100][100];
bool vis[100];
bool pie[200];
bool na[200];
int n, ans = 0;
void dfs(int x) {
if (x == n) {
ans++;
return;
}
for (int i = 0; i < n; i++) {
if (!vis[i]&&!pie[i+x] && !na[i - x + n]) {
pie[i + x] = true;
na[i - x + n] = true;
vis[i] = true;
dfs(x + 1);
vis[i] = false;
pie[i + x] = false;
na[i - x + n] = false;
}
}
}
int main() {
cin >> n;
dfs(0);
cout << ans;
return 0;
}