The partial sum problem

来源:互联网 发布:上海游族网络员工福利 编辑:程序博客网 时间:2024/04/28 17:14

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!”.
样例输入
41 2 4 71341 2 4 715
样例输出
Of course,I can!

Sorry,I can't!

   一开始只想到超时的代码,一直不知道原来for循环里可以这么奇妙,看来是对dfs不够熟练。。。。

超时代码:


 #include<iostream>#include<cstring>#include<cstdio>using namespace std;int bo[25];int a[25];int k,n,f;void dfs(int t){if(f||t>k)     return; if(t==k)f=1; for(int i=0;i<n;++i){if(!bo[i]){bo[i]=1;dfs(t+a[i]);bo[i]=0;}}}int main(){while(~scanf("%d",&n)){f=0;memset(bo,0,sizeof(bo));for(int i=0;i<n;++i){scanf("%d",&a[i]);}scanf("%d",&k);dfs(0);if(f){printf("Of course,I can!\n");}else{printf("Sorry,I can't!\n");}}return 0;}        

AC代码:


#include<iostream>#include<cstring>#include<cstdio>using namespace std;int a[25];int k,n,f,t;void dfs(int x){if(t==k)f=1;if(f||(t>k&&t>0))return;for(int i=x;i<n;++i){t+=a[i];dfs(i+1);t-=a[i];}}int main(){while(~scanf("%d",&n)){f=0;t=0;for(int i=0;i<n;++i){scanf("%d",&a[i]);}scanf("%d",&k);dfs(0);if(f){printf("Of course,I can!\n");}else{printf("Sorry,I can't!\n");}}return 0;}        


0 0
原创粉丝点击