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. 分享一个js加密的几种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. mount 命令

    命令格式:mount [-t vfstype] [-o options] device dir 嵌入式设备挂载命令mount -o nolock -t nfs 192.168.1.24:/home/t ...

  3. Css学习总结(1)——20个很有用的CSS技巧

    1. 黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate { filter: grayscale(100%); -webkit-filter: graysca ...

  4. PLSQL乱码&TNS-12557: protocol adapter not loadable解决

    PLSQL乱码&TNS-12557: protocol adapter not loadable解决 PLSQL乱码&TNS-12557: protocol adapter not l ...

  5. HDU——T 2594 Simpsons’ Hidden Talents

    http://acm.hdu.edu.cn/showproblem.php?pid=2594 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  6. CSS控制显示超出部分,用省略号显示

    经常使用.可是常忘,我又不是写css的.所以记下来: 先设置一下限制的宽度, display:block; white-space:nowrap; overflow:hidden; text-over ...

  7. 【agc009b】Tournament

    Description 一场锦标赛有n个人,总共举办n-1次比赛,每次比赛必定一赢一输,输者不能再参赛.也就是整个锦标赛呈一个二叉树形式.已知一号选手是最后的胜者,以及对于i号选手(i>1)都知 ...

  8. 网站新建移动站,做了link rel="canonical" 等于主站URL后,全站被百度K了。

    移动站所有页面的权重都指向主站的首页,估计就是被K的原因.毕竟那么多网页一下权重那么多,当然被K了.不知道啥时候能好.

  9. canvas:动态时钟

    此时针是以画布的中心为圆心: ctx.translate(width/2,width/2); 此函数是将画布的原点移到(width/2,width/2) 数字的位置我们利用了三角函数的原理 x=rco ...

  10. 洛谷 P2640 神秘磁石

    P2640 神秘磁石 题目背景 在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的, 题目描述 1.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小, ...