-
DFS
采用void型
不论当前是否查找成功,都要继续递归,不可直接终止,遍历所有可能
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int sum;//方法数
int n;//物品数
int v[21];//物品体积
bool visit[21];//访问标记
void dfs(int curv,int pos){
if(curv==40){
sum++;
return ;
}
for(int i=pos;i<n;i++){
if(curv+v[i]>40||visit[i])continue;
visit[i]=true;
dfs(curv+v[i],i+1);//无论成功或者失败都要继续下一次循环
visit[i]=false;
}
return ;
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&v[i]);
}
sum=0;
memset(visit, false, sizeof(visit));
dfs(0,0);
printf("%d\n",sum);
}
return 0;
}