The partial sum problem
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
- 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!”.
- 样例输入
-
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; }
时间: 2024-12-29 21:29:01