神奇的口袋(dfs)

神奇的口袋

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

dfs可以做

#include<iostream>
using namespace std;
const int maxn=21;
int a[maxn]; 
int vis[maxn],res,n;
void dfs(int now,int j){
    for(int i=j;i<n;i++){
        int cal=now+a[i];
        if(cal>40){//如果大于40则不要这个产品
            dfs(now,i+1);
        }else if(cal<40){//如果小于40,则试着把这件产品放进来
            dfs(cal,i+1);
        }else{ //==40,res++就可以,然后循环继续遍历后边的情况
            res++;
        }
    }
}
int main(){
    while(cin>>n){
        res=0;
        for(int i=0;i<n;i++){
            cin>>a[i];
            vis[i]=0;
        }
        dfs(0,0);
        cout<<res<<endl;
    }
    return 0;
} 
全部评论
该解答是错的,这样做会有重复,比如输入3 41 20 20,输出为2,但实际是1。
1 回复 分享
发布于 2021-01-05 15:12
在for循环后加一个判断a[i]是否大于40语句,大于则continue,即可跳过大于40的物件
1 回复 分享
发布于 2022-03-28 11:06
它的错误是:比如第一件超过40,按理来说,是进入下一个循环i=1开始考虑;它的程序是进入了dfs了,即放下第一件,从第二件开始取,这就会与i=1时候重复了。
1 回复 分享
发布于 2021-03-05 21:12
给备注个参数啊
点赞 回复 分享
发布于 2023-03-17 09:23 山东
vis数组没有维护
点赞 回复 分享
发布于 2022-02-21 11:31
所以在最后除以大于40的数目是不是就解决了
点赞 回复 分享
发布于 2021-04-03 15:07
....还以为我手算错了,
点赞 回复 分享
发布于 2021-03-05 20:21

相关推荐

03-19 17:49
运营
牛客327038019号:你把那贼低的gpa写上去干嘛
点赞 评论 收藏
分享
评论
14
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务