给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。
简单的搜索题目。
思路,对于每个数据,有两种选择,选或者不选。
代码:(183ms)
<span style="font-size:24px;">#include"stdio.h"
#include"stdlib.h"
#include"string.h"
const int maxn=30;
int a[maxn];
bool b[maxn];
bool ok=false;
void dfs(int k,int n,int num)
{
int sum=0;
for(int i=0;i<k;i++)
{
if(b[i])
sum+=a[i];
}
if(sum==num)
ok=true;
else
{
if(sum>=num) return ;
if(k>=n) return;
b[k]=1;//选
dfs(k+1,n,num);
b[k]=0;//不选
dfs(k+1,n,num);
}
}
int main()
{
int n,num;
scanf("%d%d",&n,&num);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
memset(b,0,sizeof(b));
dfs(0,n,num);
printf("%s",ok?"Yes":"No");
return 0;
}</span>
另外一种常见搜索思路。也是比较简单。
代码 (15ms)
<span style="font-size:24px;">#include"stdio.h"
#include"stdlib.h"
#include"string.h"
const int maxn=30;
int a[maxn];
bool b[maxn];
bool ok=false;
void dfs(int k,int n,int res)
{
if(k>=n) return ;
if(res==a[k])
ok=true;
else
{
if(res>a[k])
dfs(k+1,n,res-a[k]);
dfs(k+1,n,res);
}
}
int main()
{
int n,num;
scanf("%d%d",&n,&num);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
memset(b,0,sizeof(b));
dfs(0,n,num);
printf("%s",ok?"Yes":"No");
return 0;
}</span>
搜索+回溯
PS: 代码(15ms)
<span style="font-size:24px;">#include "stdio.h"
int N, K;
int A[21];
bool Search(int rest, int dep)
{
if (dep == N) return false;
if (rest == A[dep])
{
return true;
}
if (rest > A[dep]) {
rest -= A[dep];
if (Search(rest, dep + 1))
return true;
rest += A[dep];
}
return Search(rest, dep + 1);
}
int main()
{
scanf("%d %d", &N, &K);
for (int i = 0; i < N; i++) {
scanf("%d", A + i);
}
if (Search(K, 0)) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}</span>