部分和问题(Depth-First-Search):

来源:互联网 发布:劲舞团做图软件 编辑:程序博客网 时间:2024/05/19 02:40

下面列出一个很简单的DFS,如下:

部分和问题(Depth-First-Search):

 给定整数a1,a2,.......an,判断是否存在某种组合,使它们的和恰好为K.。

!限制条件

1<=n<=20

-100000000<=ai<=100000000

-100000000<=K<=100000000

输入实例:n=4

                  a={1,2,4,7}

                  k=13

输出:YES!   

处理这个问题的方法很简单,并且实现方式也可不同,最直接的方式是:在全部N个数都决定后再判断它们的和是不是K即可。判断每一种组合方式(与顺序无关)是否满足和为K的情况,如果是则输出YES!否则输出NO!

下面列出代码简单实现过程:

#include<iostream>

using namesapce std;

const int MAX_N=50;      //全局变量,最大处理数据

int a[MAX_N];     //记录输入的a1~an

int n,k;

bool dfs(int i,int sum){      //从第一个下标为0的元素开始

if(i==n)   return sum==k;  //递归出口

if(dfs(i+1,sum))                //不加a[i]的情况

         return true;

if(dfs(i+1,sum+a[i]))         //加a[i]

        return true;

return false;                     //当所有情况都遍历后,,则返回假值false

}

void solve(){  //caculate

if(dfs(0,0)) cout<<"YES!" <<endl;

else

cout<<"NO!";

}

int main(){

    cin>>n;

    cin>>k;

    getchar();

    for(int i=0;i<n;i++)

    cin>>a[i];

     solve();

}

用递归的方式将每种加和结果的可能性事件列举判断是否满足和为k,可知组合的状态数为Cn0+Cn1+Cn2+Cn3+…Cnn=2n-1(N∈[1,20]),时间复杂度为0(2n)。该题也可利用如sum=a1+a2+a3+..+an,判断是否存在数x=an=sum-(a1+a2+...an-1)即可。


0 0
原创粉丝点击