输入:n, k
题目:给n个数字,有多少组数字加起来等于k
使用dfs深搜, 代码如下
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<string>
#include<algorithm>
using namespace std;
int n, k, a[25];
int sum, ans;
void dfs(int x)
{
if(sum >= k) {
if(sum == k) ans++;
return ;
}
for(int i = x; i < n; i++) { // 加或不加的两种选择
sum = sum + a[i];
dfs(i+1);
sum = sum - a[i];
}
}
int main()
{
while(~scanf("%d %d", &n, &k)) {
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
ans = 0;
sum = 0;
dfs(0);
printf("%d
", ans);
}
}
输入这几组数据,用一个数组b[i]标记
void dfs(int x)
{
if(sum >= k) {
if(sum == k) {
ans++;
for(int i = 0; i < n; i++) {
if(b[i] == 1) // 使用过
printf("%d ", a[i]);
}
return ;
}
for(int i = x; i < n; i++) { // 加或不加的两种选择
sum = sum + a[i];
b[i] = 1; // 标记使用过
dfs(i+1);
sum = sum - a[i];
b[i] = 0;
}
}
这个dfs的加或不加和kuangbin带你飞专题一简单搜索的棋盘问题很像
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
int n, m, ans, cnt;
char a[10][10];
int b[10];
void dfs(int cur)
{
if(cnt == m) {
ans++;
return ;
}
if(cur >= n)
return ;
for(int i = 0; i < n; i++) {
if(a[cur][i] == '#' && b[i] == 0) {
b[i] = 1;
cnt++;
dfs(cur + 1);
b[i] = 0;
cnt--;
}
}
dfs(cur + 1); //**
}
int main()
{
while(~scanf("%d %d", &n, &m)) {
memset(b, 0, sizeof(b));
ans = 0;
cnt = 0;
if(n == -1 && m == -1) break;
getchar();
for(int i = 0; i < n; i++)
gets(a[i]);
dfs(0);
printf("%d
", ans);
}
return 0;
}