学了很多的算法 ,但从来没有总结过。现在开始工作了,就此开始总结大学学习的计算机算法,以告慰我即将逝去的大学生活。
深度优先搜索
深度优先搜索(DFS)是搜索的手段之一,也是数据结构中的重难点,它从某个状态开始,不断的转移状态,直到状态无法转移,然后回退到前一个状态,继续转移到其它状态,如此不断重复,直到找到最终解,或搜索完全部的状态。列如求解数独,首先在某个格子内填入适当的数,然后再继续在下一个格子内填入数字,如此继续下去。如果发现某个格子无解了,就放弃一个格子上选择的数字,改用其它可行的数字。根据深度优先搜索的特点,采用递归函数实现比较简单。
题目:
部分和问题
给定整数a1、a2、···an,判断是否可以从中选出若干数使得他们的和为k.
限制条件:
1<=n<=20
ai、k不操过int行范围
输入:
n = 4
a = {1,2,4,7}
k = 12
输出:
YES {13 = 2 + 4 + 7}
#include <iostream>
using namespace std;
#define MAX_N 20
int num[MAX_N];
int n,k;
bool hash[MAX_N];
bool dfs(int i,int sum)
{
if(sum == k)
{
return true;
}
if (i >= k)
{
return false;
}
hash[i] = false;//取第i个数
if(dfs(i+1 , sum+num[i]))
return true;
hash[i] = true;//不取第i个数
if(dfs(i+1 , sum))
return true;
return false;
}
int main()
{
cin>>n;
int i;
for(i=0;i<n;i++)
{
cin>>num[i];
hash[i] = true;
}
cin>>k;
if(dfs(0,0))
{
cout<<"YES"<<'{'<<k<<'=';
for(i=0;i<n;i++)
if(!hash[i])
{
cout<<num[i];
break;
}
for(i++;i<n;i++)
if(!hash[i])
{
cout<<'+'<<num[i];
}
cout<<'}'<<endl;
}
return 0;
}