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;
}