【DFS】DLUToj-1215-組合數字
阿新 • • 發佈:2019-02-08
題目描述:給出N個整數,每個數範圍在[-1000,1000],問能不能在N個數中選出一些數(但不可以不選,且每個數最多隻能被選擇一次),使他們的和為0
解題思路:OJ上竟然有人發郵件問我。。點開一看還是我沒做過的題。。一道DFS
好吧。。去敲了一下。顯然得剪枝一下才能過,懶得剪枝WA了一下,改完就過了
把數字分成正數和負數
sum大於0從負數那邊找
sum小於0從正數那邊找
竟然還跑了0ms。。。無語
AC程式碼:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int arr[50],vis[50]; int n,sum,found,mid,fu,zh; void dfs(int i) { //cout<<sum<<endl; if(found)return; if(!sum) found=1; else { vis[i]=1; int j; if(sum>0) { for(j=fu+1;j<mid;j++) { if(!vis[j]) { vis[j]=1; sum+=arr[j]; fu++; dfs(j); fu--; vis[j]=0; sum-=arr[j]; } } } else { for(j=zh++;j<n;j++) { if(!vis[j]) { vis[j]=1; sum+=arr[j]; dfs(j); vis[j]=0; sum-=arr[j]; } } } } } int solve() { int i; for(i=0;i<n;i++) { if(arr[i]>0)return 0; sum=arr[i]; found=0; fu=i;zh=mid; memset(vis,0,sizeof(vis)); dfs(i); if(found) return 1; return 0; } } int main() { freopen("input.txt","r",stdin); int T,i; scanf("%d",&T); while(T--) { memset(arr,0,sizeof(arr)); scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&arr[i]); sort(arr,arr+n); for(i=0;i<n;i++) { if(arr[i]>0) { mid=i;break; } } int ans=solve(); if(ans) printf("Yes\n"); else printf("No\n"); } return 0; }