问题描述:
给定整数a1、a2、… 、an,判断是否可以从中选出若干数,使他们的和恰好为k。
输入1:
n=4
a={1,2,4,7}
k=15
输出1:
No
输入2:
n=4
a={1,2,4,7}
k=13
输出2:
Yes
题目分析:
使用递归函数解决该问题
用C解决问题:
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
int n,k,a[100]; //n表示有多少个数,k表示和,预定数组大小为100
//递归函数
int dfs(int i,int sum){
//前n项和加或不加后,得到sum和k比较
if(i==n) return sum==k;
//本次调用函数时,不加数字a[i]
if(dfs(i+1,sum)) return true;
//本次调用函数时,加上数字a[i]
if(dfs(i+1,sum+a[i])) return true;
//无论是否加上a[i]都不能凑成k就返回false
return false;
}
void solve(){
if(dfs(0,0)) printf("Yes\n");
else printf("No\n");
}
int main(int argc, char *argv[]) {
int i;
printf("请输入数组中有几个数:");
scanf("%d",&n);
printf("请输入这几个数:\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("请输入和:");
scanf("%d",&k);
solve();
return 0;
}
代码分析:
拿输入2和输出2来分析:(亲自将递归走一遍可以帮助理解)
递归过程中sum的值依次为:
sum=0
sum=7
sum=4
sum=4+7=11
sum=2
sum=2+7=9
sum=2+4=6
sum=2+4+7=13
最后返回true输出Yes