部分和问题
给定一部分数,判断是否能从中选出一部分使他们的和恰好=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;
}
设向左为不加,向右为加,则若中间就可以了,就一直往后就一直向左
所以以后遇到随机相加什么的,想想可不可以用深度优先