poj1564 Sum It Up (zoj 1711 hdu 1258) DFS
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的更多相关文章
- 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 ...
- hdu 1258 DFS
I - 深搜 基础 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:10000KB 64bi ...
- HDOJ(HDU).1258 Sum It Up (DFS)
HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...
- poj1564 Sum it up
题目链接: http://poj.org/problem?id=1564 题目: Sum It Up Time Limit: 1000MS Memory Limit: 10000K Total S ...
- HDU 5143 DFS
分别给出1,2,3,4 a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- POJ 1564(HDU 1258 ZOJ 1711) Sum It Up(DFS)
题目链接:http://poj.org/problem?id=1564 题目大意:给定一个整数t,和n个元素组成的集合.求能否用该集合中的元素和表示该整数,如果可以输出所有可行解.1<=n< ...
- hdu 1258 Sum It Up(dfs+去重)
题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...
- 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) ...
随机推荐
- 分享一个js加密的几种方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- mount 命令
命令格式:mount [-t vfstype] [-o options] device dir 嵌入式设备挂载命令mount -o nolock -t nfs 192.168.1.24:/home/t ...
- Css学习总结(1)——20个很有用的CSS技巧
1. 黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate { filter: grayscale(100%); -webkit-filter: graysca ...
- PLSQL乱码&TNS-12557: protocol adapter not loadable解决
PLSQL乱码&TNS-12557: protocol adapter not loadable解决 PLSQL乱码&TNS-12557: protocol adapter not l ...
- HDU——T 2594 Simpsons’ Hidden Talents
http://acm.hdu.edu.cn/showproblem.php?pid=2594 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- CSS控制显示超出部分,用省略号显示
经常使用.可是常忘,我又不是写css的.所以记下来: 先设置一下限制的宽度, display:block; white-space:nowrap; overflow:hidden; text-over ...
- 【agc009b】Tournament
Description 一场锦标赛有n个人,总共举办n-1次比赛,每次比赛必定一赢一输,输者不能再参赛.也就是整个锦标赛呈一个二叉树形式.已知一号选手是最后的胜者,以及对于i号选手(i>1)都知 ...
- 网站新建移动站,做了link rel="canonical" 等于主站URL后,全站被百度K了。
移动站所有页面的权重都指向主站的首页,估计就是被K的原因.毕竟那么多网页一下权重那么多,当然被K了.不知道啥时候能好.
- canvas:动态时钟
此时针是以画布的中心为圆心: ctx.translate(width/2,width/2); 此函数是将画布的原点移到(width/2,width/2) 数字的位置我们利用了三角函数的原理 x=rco ...
- 洛谷 P2640 神秘磁石
P2640 神秘磁石 题目背景 在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的, 题目描述 1.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小, ...