POJhttp://poj.org/problem?id=1564

ZOJhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=711

HDUhttp://acm.hdu.edu.cn/showproblem.php?pid=1258

今天不好玩。学校网断了,wifi也用不了,爪机当热点还上不去!!!A一题容易吗!然后鼠标更不好使了,果断去买了一个。

瞬间又成穷人。T T

换了个鼠标心情大好~

------------------------------------------回到解放前的分割线------------------------------------------

题目大意:

给定一个数k,然后给出n个数,要求n个数的和要恰好等于k,输出所有可能的结果。

我的方法比较水。。。。直接DFS,然后把全部答案存进数组,最后判断是否重复。

看了别人的有简单的判断重复的方法,不用map不用set不用hash。Orz

if(a[i] != a[i-1])如果a[i]和上一个数相同,那么它不然不会放在上一个数放的位置。

如4 2 2  2 1 目标构成的和是8 那么对于第一个2来说 (递归过程中)会出现4 2 这样的,然后下一个2 可以放在它的后面 ,但就没必要放在第二个位置了。因为两个2是一样的。

我的方法。

#include<cstdio>
#include<cstring>
const int MAXN=1000+1;
int ans[MAXN][MAXN];
int a[MAXN];
bool used[MAXN]={0};
int len,n,target; bool equal(int *a1,int *b)
{
if(a1[0]!=b[0])
return false;
for(int i=1;i<a1[0];i++)
{
if(a1[i]!=b[i])
return false;
}
return true;
} void dfs(int cur,int sum)
{
if(sum > target)
return; if(target==sum)
{
int j=1;
for(int i=0;i<n;i++)
{
if(used[i])
ans[len][j++]=a[i];
}
ans[len++][0]=j;
return;
} for(int i=cur;i<n;i++)
{
if(used[i])
continue; used[i]=true;
dfs(i+1,sum+a[i]);
used[i]=false;
}
} int main()
{
while(scanf("%d%d",&target,&n),n)
{
len=0;
memset(used,0,sizeof(used));
memset(ans,0,sizeof(ans)); for(int i=0;i<n;i++)
scanf("%d",&a[i]); dfs(0,0);
printf("Sums of %d:\n",target); if(len==0)
printf("NONE\n");
else
{
memset(used,0,sizeof(used)); for(int i=0;i<len;i++) //去重复
{
for(int k=i+1;k<len;k++)
{
if(equal(ans[i],ans[k]))
used[k]=true;
}
} for(int i=0;i<len;i++)
{
if(used[i])
continue; for(int j=1;j<ans[i][0];j++)
{
if(j!=1)
printf("+");
printf("%d",ans[i][j]);
}
printf("\n");
}
}
}
}

简单的判断重复:

#include<cstdio>
#include<cstring>
const int MAXN=15+1;
int ans[MAXN];
int a[MAXN];
int len,n,target;
bool ok;
void dfs(int cur,int sum,int cnt)
{
if(sum > target)
return; if(target==sum)
{
ok=true;
printf("%d",ans[0]);
for(int i=1;i<cnt;i++)
printf("+%d",ans[i]);
printf("\n");
return;
} for(int i=cur;i<n;i++)
{
if(i==cur || a[i] != a[i-1])
{
ans[cnt]=a[i];
dfs(i+1,sum+a[i],cnt+1);
}
}
} int main()
{
while(scanf("%d%d",&target,&n),n)
{
len=0;
ok=false;
for(int i=0;i<n;i++)
scanf("%d",&a[i]); printf("Sums of %d:\n",target); dfs(0,0,0); if(ok==0)
printf("NONE\n");
}
}

poj1564 Sum It Up (zoj 1711 hdu 1258) DFS的更多相关文章

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

  2. hdu 1258 DFS

    I - 深搜 基础 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bi ...

  3. HDOJ(HDU).1258 Sum It Up (DFS)

    HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...

  4. poj1564 Sum it up

    题目链接: http://poj.org/problem?id=1564 题目: Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total S ...

  5. HDU 5143 DFS

    分别给出1,2,3,4   a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...

  6. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  7. POJ 1564(HDU 1258 ZOJ 1711) Sum It Up(DFS)

    题目链接:http://poj.org/problem?id=1564 题目大意:给定一个整数t,和n个元素组成的集合.求能否用该集合中的元素和表示该整数,如果可以输出所有可行解.1<=n< ...

  8. hdu 1258 Sum It Up(dfs+去重)

    题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...

  9. HDU 1258 Sum It Up(dfs 巧妙去重)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1258 Sum It Up Time Limit: 2000/1000 MS (Java/Others) ...

随机推荐

  1. nginx配置静态文件服务器的一个特殊需求的探索和分享, nginx处理不同路径返回统一文件,nginx改写,跳转请求.

    最近在做一个前后端分离的个人博客,在做自己博客的时候有个想法,本来是打算用nginx作为静态文件服务器使用,django做后端程序. 我的前端页面用vue写的,结果用组件用嗨了,发现页面列表和 详情都 ...

  2. 软考之路--从生活着手,看PV怎样操作

    PV操作.是软考其中一个非常重要的考点,一听到这个名词,顿时赶脚高大上有么有,在软考的历年试题中,也不乏PV操作的身影,老师也对PV操作进行了一次讲课,那时年少.听得稀里糊涂,也不是非常理解,在小编的 ...

  3. hdu 1533 Going Home 最小费用最大流 入门题

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  4. 命令行SVN的使用

    1.检出svn  co  http://路径(目录或文件的全路径) [本地目录全路径]  --username 用户名 --password 密码svn  co  svn://路径(目录或文件的全路径 ...

  5. Arch Linux下配置Samba

    本文记录笔者配置Samba的过程,供用于自用. sudo pacman -S samba sudo vim /etc/samba/smb.conf 添加以下内容 [global]    dns pro ...

  6. Nodejs源代码分析之Path

    今天介绍一下nodejs Path的源代码分析,Path的API文档在https://nodejs.org/dist/latest-v5.x/docs/api/path.html,使用相对简单,在AP ...

  7. elasticsearch节点间通信的基础transport

    在前一篇中我们分析了cluster的一些元素.接下来的章节会对cluster的运作机制做详细分析.本节先分析一些transport,它是cluster间通信的基础.它有两种实现,一种是基于netty实 ...

  8. hashlib —— Python 的 md5 和 sha1 加密

    python的md5和sha1加密 0. md5 与 sha1 MD5 的全称是 Message-Digest Algorithm 5(信息-摘要算法).128 位长度.目前 MD5 是一种不可逆算法 ...

  9. 让单选input框,不在被选中,添加disabled即可。输入框input的一些技巧

    1.让单选input框,不在被选中,添加disabled即可 2.input的file文件对象的清空,只需要input.val("");就可以了.

  10. python缩进报错

    1.这个错误应该已经好久了:也应该熟悉了才对 IndentationError: unexpected indent python 缩进错误:意外缩进Python 但今天的问题有点特殊,我想在程序中间 ...