购物券dfs剪枝

陈子骏

2018-04-02 17:40:12

Personal

``` #include<bits/stdc++.h> using namespace std; int m,n,a[41],vis[41]; int k; void find(int now) { if(now==m){ k=1;return; } if(k==1)return; for(int i=1;i<=n;i++) { if(now+a[i]>m) break; if(vis[i]==0&&now+a[i]<=m) { vis[i]=1; find(now+a[i]); vis[i]=0; } } } int main() { while(scanf("%d%d",&n,&m)==2) { k=0; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); find(0); if(k==1) printf("YES\n"); else printf("NO\n"); } } ```