nyoj 927The partial sum problem (DFS)

来源:互联网 发布:linux下安装gentoo 编辑:程序博客网 时间:2024/04/28 12:52
One day,Tom’s girlfriend give him an array A which contains N integers and asked him:Can you choose some integers from the N integers and the sum of them is equal to K. 
输入
There are multiple test cases.
Each test case contains three lines.The first line is an integer N(1≤N≤20),represents the array contains N integers. The second line contains N integers,the ith integer represents A[i](-10^8≤A[i]≤10^8).The third line contains an integer K(-10^8≤K≤10^8).
输出
If Tom can choose some integers from the array and their them is K,printf ”Of course,I can!”; other printf ”Sorry,I can’t!”.
样例输入
41 2 4 71341 2 4 715
样例输出
Of course,I can!

Sorry,I can't!

#include<stdio.h>#include<string.h>int a[25],n,t;int vis[25];int flag=0;int sum=0;void dfs(int cur){//printf("sum==%d  cur=%d\n",sum,cur);if(sum==t){flag=1;return ;}if(flag){return ;}if(cur>=n){return ;}if(sum<0){return ;}if(sum>t){return ;}//各种剪枝,不然会超时for(int i=cur;i<n;i++){if(!vis[i]){vis[i]=1;sum+=a[i];dfs(i);vis[i]=0;sum-=a[i];//printf("a[%d]=%d sum=%d\n",i,a[i],sum);}}return ;}int main(){while(scanf("%d",&n)!=EOF){memset(vis,0,sizeof(vis));memset(a,0,sizeof(a));flag=0;for(int i=0;i<n;i++){scanf("%d",&a[i]);}scanf("%d",&t);dfs(0);//从0开始if(flag){printf("Of course,I can!\n");}else{printf("Sorry,I can't!\n");}}}


0 0
原创粉丝点击