题意:

  给出一个数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 搜索的更多相关文章

  1. 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 ...

  2. poj 1564 Sum It Up (DFS+ 去重+排序)

    http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...

  3. 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 ...

  4. POJ 1564 Sum It Up (DFS+剪枝)

                                                                                                       ...

  5. poj 1564 Sum It Up【dfs+去重】

    Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6682   Accepted: 3475 Descrip ...

  6. POJ 1564 Sum It Up(DFS)

    Sum It Up Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  7. poj 1564 Sum It Up(dfs)

    Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7191   Accepted: 3745 Descrip ...

  8. POJ 1564 经典dfs

    1.POJ 1564 Sum It Up 2.总结: 题意:在n个数里输出所有相加为t的情况. #include<iostream> #include<cstring> #in ...

  9. ACM:POJ 2739 Sum of Consecutive Prime Numbers-素数打表-尺取法

    POJ 2739 Sum of Consecutive Prime Numbers Time Limit:1000MS     Memory Limit:65536KB     64bit IO Fo ...

随机推荐

  1. R 安装car包失败

    在RStudio里安装car包的时候报错 /usr/bin/ld: cannot find -llapack /usr/bin/ld: cannot find -lblas make: *** [qu ...

  2. Vue 安装教程

    1.下载node.js https://nodejs.org/en/ 2.检查环境变量: npm init (初始化项目) npm i webpack vue vue-loader 安装依赖: npm ...

  3. BNUOJ 1021 信息战(七)——情报传递

    信息战(七)——情报传递 Time Limit: 3000ms Memory Limit: 262144KB 64-bit integer IO format: %lld      Java clas ...

  4. 最小生成树prime算法模板

    #include<stdio.h> #include<string.h> using namespace std; int map[505][505]; int v, e; i ...

  5. java web解决表单重复提交

    首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提交?2.什么情况下会出现表单重复提交?3.什么情况需要避免表单重复提交? 什么叫表单提交问题,说白了,就是同一份信息,重 ...

  6. 机器学习4logistic回归

    对于线性回归.logistic回归,在以前准备学习深度学习的时候看过一点,当时的数学基础有点薄弱,虽然现在还是有点差,当时看到神经网络之后就看不下去了. 不过这次是通过python对logistic回 ...

  7. mybatis sql语句#{}和${}区别联系

    1.说白了就是,#{}用于引用字符变量,如varchar,string.因为sql语句执行过程中要给string varchar加‘’来执行. 2.${}用来引用int型等不需要添加单引号的值 3.具 ...

  8. iOS:解决pod的Insecure world writable dir问题

    当我们运行pod setup的命令的时候,有时候会碰到这个警告: /Library/Ruby/Gems/2.0.0/gems/cocoapods-0.33.1/lib/cocoapods/execut ...

  9. Linux 服务的加入删除,自己主动执行及状态

    CAMS 在安装过程中会自己主动加入相关的服务.在安装的最后过程中会提示用户是否启动服务使服务生效,须要注意的是一个服务被加入后并不表示该服务在系统启动过程中会自己主动执行,仅表示能够使用servic ...

  10. zoj2676 Network Wars(0-1分数规划,最大流模板)

    Network Wars 07年胡伯涛的论文上的题:http://wenku.baidu.com/view/87ecda38376baf1ffc4fad25.html 代码: #include < ...