Description:
现给定一个含有n个元素的数组A,要求:从这n个数中选择一些数,这些数的和恰好为k
Input:
多组测试数据。第一行为n(1<=n<=20) 第二行为n个整数,每个数的范围为(-10^8≤A[i]≤10^8) 第三行为整数k(-10^8≤k≤10^8).
Output:
如果能够达到目的,输出”Of course,I can!”; 否则输出”Sorry,I can’t!”.
Sample Input:
4
1 2 4 7
13
4
1 2 4 7
15
Sample Output:
Of course,I can!
Sorry,I can't!
代码:
//
// main.cpp
// DFS(几个数求和方案)
//
// Created by showlo on 2018/4/9.
// Copyright © 2018年 showlo. All rights reserved.
//
#include <stdio.h>
int vis[22];
int N,aim,a[22],flag,sum;
int dfs(int i,int sum){ //dfs函数
if (i<N&&vis[i]==0) {
vis[i]=1; //标记i为已访问
if (sum+a[i]==aim) //如果达到目标,标记flag为1,返回
{
flag=1;
return flag;
}
else if (sum<aim) //如果没有达到目标值,继续搜索
{
dfs(i+1, sum); //sum不包括a[i]
dfs(i+1, sum+a[i]);//sum包括a[i]
}
else
dfs(i+1, sum); //不包括a[i]
vis[i]=0;
}
return flag;
}
int main() {
while (scanf("%d",&N)!=EOF) {
flag=0;
for (int i=0; i<N; i++)
scanf("%d",&a[i]);
scanf("%d",&aim);
for (int i=0; i<N; i++)
vis[i]=0;
dfs(0,0);
if (flag==0) {
printf("Sorry,I can't!\n");
}
else
printf("Of course,I can!\n");
}
return 0;
}
感觉自己对dfs的应用还是不熟悉,比如这道题就不太清楚为什么既然标记VIS[i]=1了,后面还要还原,测试了一下不还原确实会出错。有大佬明白的,还请指教,thx!