NYOJ 题目927 The partial sum problem(dfs,剪枝)

来源:互联网 发布:网络写手如何赚钱 编辑:程序博客网 时间:2024/04/30 14:25

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!
来源
原创
上传者
TC_李远航
ac代码
#include<string.h>#include<math.h>#include<stdio.h>#include<stdlib.h>int cmp(const void *a,const void *b){return *(int *)a-*(int *)b;}int a[30],n,sum,w,v[30];void dfs(int k,int cot){int i;if(cot==sum){w=1;return;}if(w)return;for(i=k;i<n;i++){if(i&&a[i]==a[i-1]&&!v[i-1])continue;if(cot>sum&&a[i]>0)return;v[i]=1;dfs(i+1,cot+a[i]);if(w)return;v[i]=0;}}int main(){while(scanf("%d",&n)!=EOF){int i;for(i=0;i<n;i++)scanf("%d",&a[i]);scanf("%d",&sum);qsort(a,n,sizeof(a[0]),cmp);w=0;memset(v,0,sizeof(v));dfs(0,0);if(w)printf("Of course,I can!\n");elseprintf("Sorry,I can't!\n");}}


0 0
原创粉丝点击