题解 | #神奇的口袋#

神奇的口袋

http://www.nowcoder.com/questionTerminal/9aaea0b82623466a8b29a9f1a00b5d35

  • 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;
}
全部评论

相关推荐

09-19 12:15
门头沟学院 Java
迷茫的大四🐶:这下是真的打牌了,我可以用感谢信和佬一起打牌吗
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务