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!
-
思路:首先看到这道题的第一反应就是用for循环,但是因为不知道有多少个数字所以就没法确定有多少个for循环而且n较多的话根本不能用for循环,所以这时候我们就想到了深搜,一个一个的进行搜索。
-
代码:
-
#include<stdio.h> #include<cstring> #include<iostream> #include<algorithm> #include<math.h> #include<stdlib.h> #include<stack> #include<vector> #include<string.h> #include<map> #define INF 0x3f3f3f3f3f using namespace std; int flag,sum,k,n,a[101]; void dfs(int t) { if(sum>k) { return;//如果大于k就跳出 } if(sum==k) { flag=1;//等于k的话做一下标记 } for(int i=t;i<n;i++)//深搜找出相加等于k的最佳路径 { sum+=a[i]; dfs(i+1); sum-=a[i];//如果不想等的话还要将其回复称相加之前的状态,集训进行下一个循环寻找 } } int main() { while(~scanf("%d",&n)) { flag=0;sum=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } scanf("%d",&k); dfs(0); if(flag==1)//flag==1证明找到按要求输出即可 { printf("Of course,I can!\n"); } else { printf("Sorry,I can't!\n"); } } }
-
There are multiple test cases.