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. mysql字符设置乱码问题

    在操作系统中对于任意一个字符而言是没有编码格式概念的:同样的字母在不同的编码集里面可能代表不同的东西:关键在于你用什么样的软件打开它,软件本身是以什么样的编码格式来显示你的字符,那么你的字符当前就是什 ...

  2. dp之多重背包(二进制优化)

    void solve(int v,int w,int c){    int count=0;    for(int k=1;k<=c;k<<=1)    {        val[c ...

  3. 【直接拿来用のandroid公共代码模块解析与分享】の Notification和NotificationManager

    本文源代码托管在https://github.com/ASCE1885/asce-common,欢迎fork Android项目做得多了.会发现原来非常多基础的东西都是能够复用,这个系列介绍一些自己项 ...

  4. _00018 Hadoop-2.2.0 + Hbase-0.96.2 + Hive-0.13.1 分布式环境整合,Hadoop-2.X使用HA方式

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最 ...

  5. 使用wget工具抓取网页和图片 及 相关工具几个

    想保存一些网页,最后找到这 wget 的 shell脚本,虽然不是太理想,亲测可用呢. 使用wget工具抓取网页和图片   来源 https://my.oschina.net/freestyletim ...

  6. local-语言切换监听事件

    今天在更改时钟的问题的时候,需要监听语言切换来刷新时钟的显示.记录下监听方法 //注册监听事件 intentFilter.addAction(Intent.ACTION_LOCALE_CHANGED) ...

  7. popover弹出框

    <style> #view{width: 300px;height: 200px;border: 1px solid red;} </style> 以上是为了viewport更 ...

  8. NOIP2015运输计划(二分答案)

    题目描述 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有星球. 小P掌管一家物流公司,该公司有很多个运输计划,每 ...

  9. elasticsearch 源码概述

    从功能上说,可以分为两部分,分布式功能和数据功能.分布式功能主要是节点集群及集群附属功能如restful借口.集群性能检测功能等,数据功能主要是索引和搜索.代码上这些功能并不是完全独立,而是由相互交叉 ...

  10. docker构建一个简易镜像

    一 下载centos镜像 docker pull centos 二 启动镜像 [root@Centos-node3 ~]# docker run -it --name my_ng centos bas ...