36 32 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 4 8 16
应该是太有钱然后菜太便宜导致不能剪枝,然后每个1都爆搜,直接超时。。这种有啥办法
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int d[N];
bool selected[N]{false};
int n,m;
void backtrack(int m,int d[],int &res,bool selected[],int start){
if(m==0){res++;return;}
if(start>=n || m<0)return;
for(int i=start;i<n;i++){
if(!selected[i]){
selected[i]=true;
backtrack(m-d[i],d,res,selected,i+1);
selected[i]=false;
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)cin>>d[i];
int res = 0;
backtrack(m,d,res,selected,0);
cout<<res;
}