poj 1564 Sum It Up 搜索
来源:互联网 发布:华夏风云武将数据 编辑:程序博客网 时间:2024/06/11 17:35
oj 1564 Sum It Up 搜索
题意:
给出一个数T,再给出n个数。若n个数中有几个数(可以是一个)的和是T,就输出相加的式子。不过不能输出相同的式子。
分析:
运用的是回溯法。比较特殊的一点就是不能输出相同的式子。这个可以通过map来实现:map<string,int>把字符串(可以是C语言的字符串)和整数联系起来了。我们可以把相加起来的几个数变成一个字符串(2+1+1,变成“211”),如果它出现过,就标记为1,初始值是0。出现过的就不再输出了。
剪枝:
1、所有的数加起来的和小于T,直接输出NONE。
2、搜索过程中,发现sum大于t,直接return ,不再继续搜索了。如果sum等于t,验证有无重复后决定输出与否,也不再继续搜索了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<map> 7 using namespace std; 8 9 const int N=13;10 int t,n,flag,sum;11 int p[N];12 bool vis[N];13 map<string,int> st;14 char ch[30];15 void DFS(int k)16 {17 if(sum==t)18 {19 int j=0;20 for(int i=0;i<n;i++)21 {22 if(!vis[i]) continue;23 int x=p[i];24 while(x)25 {26 int y=x%10;27 ch[j++]=y+48;28 x/=10;29 }30 }31 ch[j]=0;32 if(!st[ch])33 {34 //puts(ch);35 flag=1;36 int f=0;37 for(int i=0;i<n;i++)38 {39 if(vis[i]&&f) printf("+%d",p[i]);40 if(vis[i]&&!f) {printf("%d",p[i]);f=1;}41 }42 printf("\n");43 st[ch]=1;44 return ;45 }46 47 }48 if(sum>t) return ;49 for(int i=k;i<n;i++)50 {51 sum+=p[i];52 vis[i]=1;53 DFS(i+1);54 sum-=p[i];55 vis[i]=0;56 }57 }58 int main()59 {60 //freopen("test.txt","r",stdin);61 while(scanf("%d%d",&t,&n)!=EOF&&t)62 {63 st.clear();64 printf("Sums of %d:\n",t);65 for(int i=0;i<n;i++)66 {67 scanf("%d",&p[i]);68 sum+=p[i];69 }70 if(sum<t) {printf("NONE\n");continue;}71 memset(vis,0,sizeof(vis));72 flag=0;73 sum=0;74 DFS(0);75 if(!flag) printf("NONE\n");76 }77 return 0;78 }
0 0
- poj 1564 Sum It Up 搜索
- POJ 1564 - Sum It Up
- poj 1564 Sum It Up
- poj 1564 Sum It Up
- POJ 1564 Sum It Up
- POJ-1564-Sum It Up
- poj 1564 Sum It Up
- POJ 1564 Sum It Up
- POJ 1564 Sum It Up
- POJ 1564 Sum It Up
- poj 1564 Sum It Up
- Poj 1564 Sum It Up
- poj 1564 Sum It Up
- Poj Sum It Up
- poj sum it up
- poj sum it up
- POJ 1564 Sum It Up dfs
- poj 1564 Sum It Up -- DFS 递归
- 大数据.......
- mysql存储引擎InnoDB插入数据的过程详解
- HDU 1789 Doing Homework again
- Spark 性能相关参数配置详解-shuffle篇
- 如何new一个二维数组
- poj 1564 Sum It Up 搜索
- POJ3641(Pseudoprime numbers 费马小定理)
- 界面之间传值
- jQuery 的 ready 函数是如何工作的?
- 12. 打印1到最大的n位数
- WeChatServer
- UVA 436Arbitrage (II)【floyd】
- 冷知识:你知道每个视窗都有的 [x] 是怎麽来的吗?
- C语言堆栈入门——堆和栈的区别