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 Submission(s) : 4 Accepted Submission(s) : 1
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
Output
Sample Input
4 6 4 3 2 2 1 1
5 3 2 1 1
400 12 50 50 50 50 50 50 25 25 25 25 25 25
0 0
Sample Output
Sums of 4:
4
3+1
2+2
2+1+1
Sums of 5:
NONE
Sums of 400:
50+50+50+50+50+50+25+25+25+25
50+50+50+50+50+25+25+25+25+25+25
Source
Accepted | 388K | 0MS | G++ | 930B |
#include <stdio.h>
#include <string.h> int a[15];
int p[15];
int vis[15];
int t, n, flag; void dfs(int k, int sum) {
int i;
if(k>n || sum<0) return ;
if(sum==0) {
flag = 1;
for(i=0; i<k-1; i++)
printf("%d+",p[i]);
printf("%d\n",p[i]);
return ;
}
for(i=k; i<n; i++)
if(!vis[i]) {
if(sum-a[i]<0||(k>0&&a[i]>p[k-1])) continue;
vis[i] = 1;
p[k] = a[i];
dfs(k+1,sum-a[i]);
vis[i] = 0;
while(i+1<n&&a[i]==a[i+1]) i++; //搜索完毕后,若下一个搜索的数仍与当前相同,则寻找下一个不同的数进行搜索。{去重}
}
}
int main() {
int i;
while(scanf("%d%d",&t,&n),t+n) {
for(i=0; i<n; i++) scanf("%d",&a[i]);
i = 0;
while(i<n&&a[i]>t) i++;
printf("Sums of %d:\n",t);
flag = 0;
memset(vis,0,sizeof(vis));
dfs(i,t);
if(!flag) printf("NONE\n");
}
return 0;
}
code2:(用 set 去重:在POJ和ZOJ上提交全挂,不过hdu上能AC,呃呃呃~)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <functional>
#include <vector>
#include <string>
#include <set>
using namespace std;
#define N 20
int t, n;
int a[N];
int list[N];
bool vis[N];
set<string> s;
bool flag; void dfs(int k, int sum) {
int i;
if(k>=n || sum<0) return;
if(sum==0) {
string str;
for(i=0; i<k; i++) {
str +=(list[i]/10) +'0';
str +=(list[i]%10) +'0';
}
if(s.find(str)==s.end()) {
s.insert(str);
flag = 1;
for(i=0; i<k-1; i++)
printf("%d+",list[i]);
printf("%d\n",list[i]);
}
return ;
}
for(i=k; i<n; i++)
if(!vis[i]&&(k==0||a[i]<=list[k-1])) {
vis[i] = 1;
list[k] = a[i];
dfs(k+1,sum-a[i]);
vis[i] = 0;
}
}
int main() {
int i;
while(scanf("%d%d",&t,&n),t+n) {
for(i=0; i<n; i++) {
scanf("%d",&a[i]);
}
memset(vis,0,sizeof(vis));
printf("Sums of %d:\n",t);
flag = false;
s.clear();
dfs(0,t);
if(!flag) printf("NONE\n");
}
return 0;
}
poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)的更多相关文章
- 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 ...
- poj 1564 Sum It Up
题目连接 http://poj.org/problem?id=1564 Sum It Up Description Given a specified total t and a list of n ...
- poj 1564 Sum It Up (DFS+ 去重+排序)
http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...
- poj 1564 Sum It Up【dfs+去重】
Sum It Up Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6682 Accepted: 3475 Descrip ...
- POJ 1564 Sum It Up(DFS)
Sum It Up Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- POJ 1564 Sum It Up (DFS+剪枝)
...
- poj 1564 Sum It Up 搜索
题意: 给出一个数T,再给出n个数.若n个数中有几个数(可以是一个)的和是T,就输出相加的式子.不过不能输出相同的式子. 分析: 运用的是回溯法.比较特殊的一点就是不能输出相同的式子.这个可以通过ma ...
- poj 1564 Sum It Up(dfs)
Sum It Up Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7191 Accepted: 3745 Descrip ...
- hdu 4821 字符串hash+map判重 String (长春市赛区I题)
http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...
随机推荐
- 强大的Mockito测试框架(转)
1.自动生成Mock类在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations.i ...
- Uva 11694 Gokigen Naname
基本思路是Dfs: 1. 一个一个格子摆放,以每个各自的左上角的点为基准点代表格子,比如(0,0)代表(0,0)(0,1)(1,0)(1,1)组成的格子,(0,1)代表(0,1)(0,2)(1,1), ...
- poj 1979 Red and Black(dfs)
题目链接:http://poj.org/problem?id=1979 思路分析:使用DFS解决,与迷宫问题相似:迷宫由于搜索方向只往左或右一个方向,往上或下一个方向,不会出现重复搜索: 在该问题中往 ...
- PHP中magic_quotes_gpc和 magic_quotes_runtime区别及其反斜线转义问题
php中关于反斜线转义: php中数据的魔法引用函数 magic_quotes_gpc 或 magic_quotes_runtime 设置为on时,当数据遇到 单引号' 和 双引号&quo ...
- OTN交换&P-OTN有效减少100G网络成本(一)
近年来.网络运营商一直严重依赖基于ROADM的光传送设备,利用固定的点到点WDN联接.利用10G波长在整个城域网和广域网中汇聚及传送client业务.假设这些网络经过精细的设计规划,也能够合理.有效地 ...
- android -- 蓝牙 bluetooth (四)OPP文件传输
在前面android -- 蓝牙 bluetooth (一) 入门文章结尾中提到了会按四个方面来写这系列的文章,前面已写了蓝牙打开和蓝牙搜索,这次一起来看下蓝牙文件分享的流程,也就是蓝牙应用opp目录 ...
- stm32之595(spi芯片)
595是一款串转并的芯片: (三极管的功能) /*Include---------------------------*/ #include"stm32f10x_lib.h" / ...
- Javascript常用函数收集(不定期更新)
str.replace('/正则表达式/','替换内容'); //正则替换str.match('/正则表达式/','替换内容'); //正则匹配 str.indexOf('查找代码'); //查找是否 ...
- oracle中if/else
oracle中if/else功能的实现的3种写法 1.标准sql规范 一.单个IF 1. if a=... then ......... end if; 2. if a=... then .... ...
- Directshow 通过 put_Owner 指定显示窗口后,自动刷新问题
在Directshow中,我们可以对render指定显示窗口,在写程序的过程中, 发现通过put_Owner设置的显示窗口存在自动刷新问题,譬如窗口被遮挡然后再次露出时,被遮挡部分不能自动刷新,需要拖 ...