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) ...
随机推荐
- 网上看到的一些IT资源
A.网站模板+logo+服务器主机+发票生成 HTML5 UP:响应式的HTML5和CSS3网站模板. Bootswatch:免费的Bootstrap主题. Templated:收集了845个免费的C ...
- OpenCV —— 轮廓
把检测出的边缘像素组装成轮廓 —— cvFindContours OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储 ...
- jQuery Easy UI Panel(面板)组件
panel(面板)组件,跟前面的组件使用方法差点儿都差点儿相同,也是从设置一些面板属性.操作面板触发的事件.我们可针对面板对象的操作方法这三个点去学习. 后面有一些组件要依赖于这个组件. 另一点跟前面 ...
- HDU 3072--Intelligence System【SCC缩点新构图 && 求连通全部SCC的最小费用】
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- php实现排列组合
php实现排列组合 一.总结 1.回溯:回溯的函数参数有些生疏了,记录递归的位置(pos或step),还要有东西(vis数组)来记录这个是否已经被访问 2.php全局变量的使用 :外部定义的普通变量, ...
- Mahout项目开发环境搭建(Eclipse\MyEclipse + Maven)
继续 http://www.tuicool.com/articles/rmiEz2 http://www.cnblogs.com/jchubby/p/4454888.html
- 洛谷 P2873 [USACO07DEC]泥水坑Mud Puddles
P2873 [USACO07DEC]泥水坑Mud Puddles 题目描述 Farmer John is leaving his house promptly at 6 AM for his dail ...
- oracle学习之路(二)------数组类型/记录类型的使用
Oracle记录类型介绍 RECORD:用户自己定义数据类型,由单行多列的标量构成的复合数据类型.它将一个或多个标量封装成一个对象进行操作记录不能够总体拿来比較也不能够总体推断为空.能够总体拿来赋值. ...
- 玩转Bootstrap(基础) -- (6.导航条基础)
1.导航条样例 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...
- HTML基础第十讲---排版卷标
转自:https://i.cnblogs.com/posts?categoryid=1121494 网页的排版部份也是很重要的一环,有些现成的卷标就可以让您轻易的完成缩排或是一些特殊格式的编排喔! [ ...