部分和问题(深搜)

Description

给出一组整数,a1、a2、a3...、an,判断是否可以从中抽取若干数,使他们的和恰好为k;
限制条件:
1<= n <=20;-10^8<=ai<=10^8; -10^8 <= k <= 10^8;

Input

输入n,然后输入n 个数字,再输入k

Output

如果可以使和为k,则输出Yes,否则输出No;

Sample Input

n = 4
a = {1,2,4,7}
k = 13

Sample Output

Yes

代码:

/*
从a1开始,按顺序决定加与不加,在全部n个数都决定后在判断他们的和是不是k即可。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define Max 100000000
using namespace std;
int n,k;
int a[Max];
bool dfs(int i,int sum)
{
    //如果前n项都加过了则返回sum是否与k 相等
    if(i == n+1)
        return sum == k;
    //不加a[i]
    if(dfs(i+1,sum))
        return true;
    //加a[i];
    if(dfs(i+1,sum+a[i]))
        return true;
    return false;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&k);
    if(dfs(1,0))
        printf("Yes\n");
    else
        printf("No\n");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值