• DFS深搜有关数字和的问题


    输入: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;
    }

  • 相关阅读:
    数据结构-链式结构-队列
    c数据结构-线性结构-队列
    栈的四则运算的运用
    C++/C—函数指针
    向显存写数据x8086
    结构体内存偏移量
    MFC-ComboBox控件的使用
    MFC的Edit text编辑框控件
    C/C++反汇编-各种表达式(加减乘)
    MFC- 学习控件-静态文本
  • 原文地址:https://www.cnblogs.com/smuzoey/p/11787447.html
Copyright © 2020-2023  润新知