部分和问题

给定一部分数,判断是否能从中选出一部分使他们的和恰好=k

1<=n<=20        -10^8<=ai<=10^8        -10^8<=k<=10^8

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

输出    Yes

这个题是我一看就懵的题,今天终于见到题解了,但是!我完全想不到会这么做,用深度优先搜索,怎么会用这个?

首先强调一下什么是递归,我老是分不清递归递推,今天终于知道什么事递归了,但是递推还是不知道

在函数中再次调用该函数自身的行为叫做递归,编写递归函数是一定要终止函数的

然后这个题就是dfs加递归

#include<cstdio>
int n,k,a[30];
bool dfs(int i,int sum)
{
    if(i==n)//每一次都要算到n,就算中间相等也是要算到n
        return sum==k;//这个的意思是如果相等就返回1,不想等就返回0
    if(dfs(i+1,sum))//不加a[i],若经过这一步,则i+1,sum不变,不行就经过下一步
        return true;
    if(dfs(i+1,sum+a[i]))//加a[i],就是sum加,走右边,反正就是所有情况都列一遍
        return true;
    return false;//若是其中一个满足就返回停止,相当于剪枝
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%d",&k);
    if(dfs(0,0))
        printf("Yes\n");
    else
        printf("No\n");
    return 0;
}

设向左为不加,向右为加,则若中间就可以了,就一直往后就一直向左

所以以后遇到随机相加什么的,想想可不可以用深度优先

posted @ 2016-07-18 17:56  小小姐  阅读(80)  评论(0编辑  收藏  举报