部分和问题是经典的DFS问题,题目描述见样例输入输出。
【样例输入输出】
多组输入输出
Input
4
1 2 3 4
9
4
1 2 3 4
8
4
1 2 3 4
11
Output
Yes
Yes
No
输入
4
1 2 3 4
9
后输出Yes
代表,能从1,2,3,4这4个数中找到一个组合,这个组合之和为9.
【代码】
(思路和出错部分见注释)
#include<stdio.h>
#define MAXLENGTH 105
// 从a[i],a[i+1],……,a[n-1]中能否找到一个组合之和加上sum为k,返回1和0分别代表能或者不能
int dfs(int *a,int i,int sum,int n,int k){
// 正确设置递归边界
if(i==n){ //致命错误:误写成i==n-1
if(sum==k){
return 1;
}
else{
return 0;
}
}
else{
if(dfs(a,i+1,sum,n,k)==1){ //不加a[i]试一试
return 1;
}
if(dfs(a,i+1,sum+a[i],n,k)==1){ //加上a[i]试一试
return 1;
}
//如果至此函数还没有返回,说明没有解决方案,则返回0
return 0;
}
}
int main(){
int a[MAXLENGTH];
int n,k;
while(scanf("%d",&n)==1){
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
scanf("%d",&k);
(dfs(a,0,0,n,k)==1)?printf("Yes\n"):printf("No\n");
}
return 0;
}