poj 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,验证有无重复后决定输出与否,也不再继续搜索了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std; const int N=;
int t,n,flag,sum;
int p[N];
bool vis[N];
map<string,int> st;
char ch[];
void DFS(int k)
{
if(sum==t)
{
int j=;
for(int i=;i<n;i++)
{
if(!vis[i]) continue;
int x=p[i];
while(x)
{
int y=x%;
ch[j++]=y+;
x/=;
}
}
ch[j]=;
if(!st[ch])
{
//puts(ch);
flag=;
int f=;
for(int i=;i<n;i++)
{
if(vis[i]&&f) printf("+%d",p[i]);
if(vis[i]&&!f) {printf("%d",p[i]);f=;}
}
printf("\n");
st[ch]=;
return ;
} }
if(sum>t) return ;
for(int i=k;i<n;i++)
{
sum+=p[i];
vis[i]=;
DFS(i+);
sum-=p[i];
vis[i]=;
}
}
int main()
{
//freopen("test.txt","r",stdin);
while(scanf("%d%d",&t,&n)!=EOF&&t)
{
st.clear();
printf("Sums of %d:\n",t);
for(int i=;i<n;i++)
{
scanf("%d",&p[i]);
sum+=p[i];
}
if(sum<t) {printf("NONE\n");continue;}
memset(vis,,sizeof(vis));
flag=;
sum=;
DFS();
if(!flag) printf("NONE\n");
}
return ;
}
poj 1564 Sum It Up 搜索的更多相关文章
- poj 1564 Sum It Up
题目连接 http://poj.org/problem?id=1564 Sum It Up Description Given a specified total t and a list of n ...
- poj 1564 Sum It Up (DFS+ 去重+排序)
http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...
- poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
Sum It Up Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- POJ 1564 Sum It Up (DFS+剪枝)
...
- poj 1564 Sum It Up【dfs+去重】
Sum It Up Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6682 Accepted: 3475 Descrip ...
- POJ 1564 Sum It Up(DFS)
Sum It Up Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- poj 1564 Sum It Up(dfs)
Sum It Up Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7191 Accepted: 3745 Descrip ...
- POJ 1564 经典dfs
1.POJ 1564 Sum It Up 2.总结: 题意:在n个数里输出所有相加为t的情况. #include<iostream> #include<cstring> #in ...
- ACM:POJ 2739 Sum of Consecutive Prime Numbers-素数打表-尺取法
POJ 2739 Sum of Consecutive Prime Numbers Time Limit:1000MS Memory Limit:65536KB 64bit IO Fo ...
随机推荐
- 匈牙利算法求最大匹配(HDU-4185 Oil Skimming)
如下图:要求最多可以凑成多少对对象 大佬博客: https://blog.csdn.net/cillyb/article/details/55511666 https://blog.csdn.net/ ...
- The meaning of the number displayed on the man page in Linux
0 Header files 0p Header files (POSIX) 1 Executable programs or shell commands 1p Executable program ...
- python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影
我们在之前的文章谈到了高效爬虫 在 python 中 多线程下的 GIL 锁会让多线程显得有点鸡肋 特别是在 CPU 密集型的代码下 多线程被 GIL 锁搞得效率不高 特别是对于多核的 CPU 来说 ...
- hdu2008 数值统计【C++】
数值统计 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 关于linux中使用vim打开文件出现^M的解决方法
在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件.我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致, 各 ...
- hdu_hpu第八次周赛_1001 To and Fro 201310270918
To and Fro Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Su ...
- M - Substrings
You are given a number of case-sensitive strings of alphabetic characters, find the largest string X ...
- [bzoj1941][Sdoi2010]Hide and Seek_KD-Tree
Hide and Seek bzoj-1941 Sdoi-2010 题目大意:给出平面上n个点,选出一个点,使得距离这个点的最远点曼哈顿距离减去距离这个点的最近非己点的曼哈顿距离最小.输出最小曼哈顿距 ...
- data guard 的redo 传输
data guard 通过把redo从primary数据库传输到standby数据库并应用在standby数据库来实现自己的功能. redo 传输是有2种模式 1. 同步 sync 2. 异步 asy ...
- web项目log日志查看分析->流程理解
1.DEBUG [2017-07-10 11:38:41,705][] org.springframework.web.servlet.DispatcherServlet:865 - Dispatch ...