nyoj Thepartialsumproblem(DFS)
2016-12-10 20:23
363 查看
[align=center]Thepartialsumproblem[/align]
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.
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).
[align=left]ps:深搜也要讲方法的,我临时想的一个搜法,果断超时。。[/align]
[align=left]超时代码:[/align]
ps:吃一顿饭回来,想到了以前的部分和问题,然后用那种方法试一试,,竟然A了
AC代码:
ps:深搜剪枝剪枝,还是要多想想,找到最优的剪枝方法。尽量少用循环。。
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.
Input
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).
Output
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!”.Sample Input
4 1 2 4 7 13 4 1 2 4 7 15
Sample Output
Of course,I can! Sorry,I can't!
[align=left]ps:深搜也要讲方法的,我临时想的一个搜法,果断超时。。[/align]
[align=left]超时代码:[/align]
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int n,k,flag,x; int a[22]; void dfs(int s) { if(abs(s-k)>x) return ; if(s==k) flag=1; if(flag) return ; for(int i=0; i<n; i++)//这一点很关键,用此法无故多了好多分枝。。 { if(a[i]) { int m=a[i]; a[i]=0; dfs(s+m); a[i]=m; } } } int main() { while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); int i,y1=0,y2=0; for(i=0; i<n; i++) { scanf("%d",&a[i]); if(a[i]>0) y1+=a[i]; else y2+=a[i]; } scanf("%d",&k); if((k>0&&y1<k)||(k<0&&y2>k)) printf("Sorry,I can't!\n"); else { flag=0; x=abs(k); dfs(0); if(flag) printf("Of course,I can!\n"); else printf("Sorry,I can't!\n"); } } return 0; }
ps:吃一顿饭回来,想到了以前的部分和问题,然后用那种方法试一试,,竟然A了
AC代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int n,k,flag,x; int a[22]; int dfs(int i,int sum) { if(abs(sum-k)>x) return 0; if(sum==k) return 1; if(i==n) retur 4000 n sum==k; if(dfs(i+1,sum))//少了好多分枝。。 return 1; if(dfs(i+1,sum+a[i]))// return 1; } int main() { while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); int i,y1=0,y2=0; for(i=0; i<n; i++) { scanf("%d",&a[i]); if(a[i]>0) y1+=a[i]; else y2+=a[i]; } scanf("%d",&k); if((k>0&&y1<k)||(k<0&&y2>k)) printf("Sorry,I can't!\n"); else { x=abs(k); if(dfs(0,0)) printf("Of course,I can!\n"); else printf("Sorry,I can't!\n"); } } return 0; }
ps:深搜剪枝剪枝,还是要多想想,找到最优的剪枝方法。尽量少用循环。。
相关文章推荐
- nyoj Thepartialsumproblem(DFS)
- nyoj Thepartialsumproblem(DFS)
- nyoj Thepartialsumproblem(DFS)
- nyoj Thepartialsumproblem(DFS)
- nyoj Thepartialsumproblem(DFS)
- nyoj Thepartialsumproblem(DFS)
- nyoj Thepartialsumproblem(DFS)
- Android自定义View之Activity页面的组成
- sdut oj面向对象程序设计上机练习十二(运算符重载)
- 环境搭建之rabbitmq安装步骤(win64)
- 使用ycsb测试cassandra
- Python中的装饰器
- 关于webpack.optimize.CommonsChunkPlugin的使用二
- [LeetCode]Fraction to Recurring Decimal
- JavaScript新窗体的打开与关闭
- hive内部表与外部表区别详细介绍
- 谈一谈
- DGMGR-TO PHYSICAL STANDBY Failed (ORA12514 )解决方法
- gitlab的用户使用手册
- 树莓派驱动6轴传感器MPU6500与SPI初体验(三) -串口姿态显示