标签:
4 1 2 4 7 13 4 1 2 4 7 15
Of course,I can! Sorry,I can‘t!
题意:很简单,就是给你一个数组,和一个值k,是否能从数组中找到n个数之和等于k
思路:直接dfs,不过这个题好像时间有点限制,所以要一个简单的剪枝
Code:
//开始的思路不是很清晰,太盲目的做,因为初始化和回溯的问题wa了两次,然后改好之后又果断超时了,没有考虑剪枝和重复搜索的问题. //看了一下别人的代码瞬间开窍了,这么简单的题目还wa真是醉了 #include <stdio.h> #include <string.h> int a[20],n,k,flage,vis[20]; void dfs(int now,int sum) { int i; if(sum>=k) { if(sum==k) flage=1; return ; } else { for(i=now;i<n;i++) //这里从now开始就行了,之前的思路是把所有的情况全部考虑了中间会出现重复的情况 { if(vis[i]==0) { vis[i]=1; sum+=a[i]; dfs(i+1,sum); if(flage) //这里做了一个剪枝,如果已经可以找到,那么后面就不用找了 return; sum-=a[i]; vis[i]=0; } } } } int main() { int sum,i; while(scanf("%d",&n)!=EOF) { flage=0; sum=0; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&k); dfs(0,0); if(flage) printf("Of course,I can!\n"); else printf("Sorry,I can't!\n"); } return 0; }
nyoj927 The partial sum problem(dfs)
标签:
原文地址:http://blog.csdn.net/sxx312/article/details/51353774