初次接触深度搜索DFS

首先输入n表示有n个数

再将n个数存入数组中

输入一个k表示n个数中可以累和出k

分析:

每个数都有两种状态加入累和与不加入累和


#include <iostream>
using namespace std ;
const int MAX_N = 1000 ;
int a[MAX_N] ;
bool visited[MAX_N] ;  //用于记录是否会把第i个数加入累和     
int n , k;

bool dfs(int i , int sum)   // 对第i个数 sun:到第i-1个数的累和 
{
	if(i == n) return sum == k; //一个分支搜索结束 
	if(dfs(i+1 , sum)) //表示不加上第i个数 
	{
		visited[i] = false ;
		return true ;
	}
	if(dfs(i+1 , sum + a[i]))   //表示加上第i个数 
	{
		visited[i]=true ;
		return true ;
	}
	return false ;
}

int main()
{
	cin >> n ;
	memset(visited,0 ,sizeof(visited)) ;
	for(int i = 0 ; i < n ; i++)
	{
		cin >> a[i] ;
	}
	cin >> k ;
	if(dfs(0 , 0))
	{
		cout << "YES\n" ; 
		for(int i = 0 ; i < n ; i++)
		{
			if(visited[i])
				cout << a[i] << " " ;
		}
		cout << endl ;
	}
	else
	{
		cout << "NO\n" ;
	}
	
	return 0;
}

先加

#include <iostream>
using namespace std;
const int MAX_N = 100000;
int a[MAX_N];
bool visit[MAX_N];
int n;
int k;
int sum;
bool ok;
void dfs(int pas);
int main()
{
    while(cin >> n)
    {
        ok = false;
        for(int i = 0; i < n; i++)
            cin >> a[i];
        cin >> k;
        memset(visit, false, sizeof(visit));
        sum = 0;
        dfs(0);
        if(!ok) cout << "No\n";
    }

    return 0;
}

void dfs(int pas)
{
    if(sum >= k)
    {
        if(sum == k)
        {
            if(!ok)
            {
                cout << "Yes" << endl;
                ok = true;
            }
            for(int i = 0; i < n; i++)
            {
                if(visit[i])
                    cout << a[i] << ' ';
            }
            cout << endl;
        }
        return;
    }
    for(int i = pas; i < n; i++)
    {
        sum += a[i];
        visit[i] = true;
        dfs(i + 1);
        sum -= a[i];
        visit[i] = false;
    }
}



扫描二维码关注公众号,回复: 909401 查看本文章

猜你喜欢

转载自blog.csdn.net/ly1390811049/article/details/50876129
今日推荐