ZOJ_1204_AdditiveEquations
2015-07-23 15:39
197 查看
第一个dfs的题目
就是求一个没有重复的正整数的序列能组成的加法算式并输出
一边是几个加数,另一边是和。
排列顺序每个式子数字由小到大
加数个数由少到多(这个还坑了我一下)
感觉要写dfs一定要理清楚思路不然写代码会很卡
就是求一个没有重复的正整数的序列能组成的加法算式并输出
一边是几个加数,另一边是和。
排列顺序每个式子数字由小到大
加数个数由少到多(这个还坑了我一下)
感觉要写dfs一定要理清楚思路不然写代码会很卡
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; const int M=31; int s[M]; //存储输入 int l[M]; //目前搜索了的加数 //int in=0; void showe(int nu,int sp) { for(int i=0;i<nu-1;i++) printf("%d+",l[i]); printf("%d=%d\n",l[nu-1],sp); } int dfs(int tot,int nu,int maxn,int p,int m) //tot之前的和 nu之前有的数 maxn最大要几个数,p前一个位置,m数字个数 { // in++;cout<<in<<" "<<p<<" "<<tot<<" "<<nu<<endl;cout<<l[0]<<" "<<l[1]<<endl; if(p>=m-1) return 0; if(nu==maxn) { for(int i=p+1;i<m;i++) if(tot==s[i]) { showe(nu,s[i]); return 1; } return 0; //这个return能减掉不少 ,第一次超时应该就是因为这个 } int f=0; for(int i=p+1;i<m;i++) { l[nu]=s[i]; if(dfs(tot+s[i],nu+1,maxn,i,m)) f=1; } return f; } int main() { int n; int m; int f; scanf("%d",&n); while(n--) { f=0; scanf("%d",&m); for(int i=0;i<m;i++) scanf("%d",&s[i]); sort(s,s+m); int tmp=s[m-1],nmax=0; //这个也能排除一些根本不可能出现的加数个数 while(tmp>=0) //但是如果有极限数据出现这个也没什么用 { tmp-=s[nmax]; nmax++; } for(int i=2;i<=nmax-1;i++) { if(dfs(0,0,i,-1,m)) f=1; } if(!f) printf("Can't find any equations.\n"); printf("\n"); } return 0; }
相关文章推荐
- xp里如何不用重启切换用户名访问服务器
- java.util.ResourceBundle使用详解
- 输入时间段返回式第几周星期几
- 文件的逻辑结构有哪两种形式?
- Oracle + Entity Framework 更新没有设置主键的表
- 活动的运用技巧
- Cookie和Session
- java 反射1
- 在VMware虚拟机系统添加串口(使用物理串口)
- mybatis转义问题
- 从Linux Deepin下小米2s刷机的“生”与“死”看Android手机的分区
- android 围绕中心旋转动画
- 华为6502做端口镜像
- 了解HTML5和“她”的 API (一)
- UI—代理简单使用
- 软件测试之性能测试:大促带来的灾难
- 文章标题
- redis安装与配置
- 保存文件到内存
- 麦子学院android开发教程:android手势翻页效果