深度优先搜索的用法——求数组部分和

深度优先搜索的用法——求数组部分和

 

问题主题:求数组部分和

问题描述:

给定整数a1,a2, … an,判断能否从中选出若干个数,使得它们的和为k。

限制条件:

1<=n<=20

-108<=ai<=108

-108<=k<=108

样例:

输入

n=4

a={1,2,4,7}

k=13

输出

Yes (13=2+4+7)

输入

n=4

a={1,2,4,7}

k=15

输出

    No

 

 

【解法一】

解题分析:

    用递归的方法实现深度优先搜索,从a0开始依次判断,决定ai加入或不加入,对每一个种组合进行判断,决定是否存在和为k的情况。

程序实现:

 

C++

#include "stdafx.h"

#include "iostream"

 

using namespace std;

 

const int MAX = 10;

int     result;

int a[MAX];

int sum = 0;

 

bool resolve(int a[], int n, int i, int sum) ;

 

int _tmain(int argc, _TCHAR* argv[]) {

         int n;

         cout << "?º?¨?n¨ª¨¢?Ì?䨮?:" <<endl;

         cin >> n >> result;

         cout << "?º?¨?n?ºy:" <<endl;

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

                   cin >> a[i];

         }

         if(resolve(a, n, 0, sum))

                   cout << "Yes" <<endl;

         else

                   cout << "No" << endl;

         return 0;

}

 

bool resolve(int a[], int n, int i, int sum) {

         if(i >= n)

                   return sum == result;

         //??a[i]

         if(resolve(a, n, i+1, sum))

                   return true;

         //¨®¦?a[i]

         if(resolve(a, n, i+1, sum+a[i]))

                   return true;

         return false;

}

 

Java

/**
 * User: luoweifu
 * Date: 14-1-7
 * Time: 上午11:33
 */
public class PartSum {
    private int array[];
    private int result;
    public PartSum() {
 
    }
 
    public PartSum(int[] array, int result) {
        this.array = array;
        this.result = result;
    }
 
       public void setArray(int[] array) {
              this.array = array;
       }
 
       public void setResult(int result) {
              this.result = result;
       }
 
       public boolean resolve(int[] array, int i, int sum) {
              int n = array.length;
              if(i >= n)
                     return sum == result;
              if(resolve(array, i+1, sum))
                     return true;
              if(resolve(array, i+1, sum+array[i]))
                     return true;
              return false;
       }
 
       public void partsumResolve() {
              if(resolve(array, 0, 0))
                     System.out.println("Yes");
              else
                     System.out.println("No");
       }
 
       public static void main(String args[]) {
              PartSum partSum = new PartSum(new int[]{1,2,4,7}, 13);
              partSum.partsumResolve();
              partSum.setResult(15);
              partSum.partsumResolve();
       }
 
}


 

算法复杂度:

    时间复杂度O(2n)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌尘(MoChen)

爱打赏的人技术成长更开哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值