hdu 1258 Sum It Up(dfs+去重)
题目大意:
给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法。
例如,total = 4,n = 6,list = [4,3,2,2,1,1]。
有四种不同的方法使得它们相加的结果等于total(即等于4),分别为:4,3+1,2+2, 2+1+1。
在同一种拼凑方式中,每个数字不能被重复使用,但是在list中可能存在许多相等的数字。
输入:
输入包含许多测试用例,每个用例仅占一行。每个用例包含t(total),接下来是n,接着是用空格隔开的n个整数。如果n等于零,表示输入结束。t∈(0,1000),n∈[1, 12],list中的每个整数∈[1, 100],list中的数字是以降序排列,数字中可能出现重复的数字。
输出:
每个测试用例,第一行输出“Sums of [total的值]:”,接下每一行输出一个结果集,如果一个结果集都没有则输出“NONE”。每个结果集要按照降序输出,并且结果集之间也要按照降序排序,结果集之间的比较从第一个数字开始,数字大的结果集大,如果第一个数字相同,则比较第二个数字,第二个数字大的,则结果集大,如果第二个数字也相同,则比较第三个数字,以此类推。不能出现相同的结果集。
解题思路:
类似hdu 1455 Sticks,但是比1455简单的多。搞一个数组记录结果集,每次搜索到结果的时候,就输出结果集,由于list是降序的,并且数字可能在list中重复出现,因此回溯的时候记得去掉重复的结果集。
AC代码:
//19475530 2017-01-02 21:07:46 Accepted 1258 0MS 1720K 1332 B C++ 潮州牛肉丸
#include <stdio.h>
#include <string.h> int total; // the list that add up to total. t < 1000
int n; // list中元素个数
int list[]; // 记录数字 list[x] ∈ (0, 100)
bool visit[]; // 判重 int result[]; // 记录结果集
int count; // 记录result中的元素个数
int flag; // 记录是否搜索到结果,一次都没有搜索到则为false void init(void)
{
count = ;
flag = false;
memset(list, 0x00, sizeof(list));
memset(visit, 0x00, sizeof(visit));
} // sum:当前累加和,index:上一次搜索到的下标位置
void dfs(int sum, int index)
{
if (total == sum)
{
// 输出结果集
flag = true;
printf("%d", result[]);
for (int i = ; i < count; ++i)
printf("+%d", result[i]);
printf("\n");
return;
} for (int i = index + ; i < n; ++i)
{
if (true == visit[i])
continue; if (list[i] + sum <= total)
{
result[count++] = list[i];
visit[i] = true;
dfs(list[i] + sum, i);
visit[i] = false;
count--; // 关键:去掉重复的结果集
while (i < n && list[i] == list[i + ]) ++i;
}
}
return;
} int main(void)
{
while (scanf("%d %d", &total, &n) != EOF && != n)
{
init();
for (int i = ; i < n; ++i)
scanf("%d", &list[i]); printf("Sums of %d:\n", total);
dfs(, -);
if (false == flag)
printf("NONE\n");
}
return ;
}
hdu 1258 Sum It Up(dfs+去重)的更多相关文章
- HDOJ(HDU).1258 Sum It Up (DFS)
HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...
- (step4.3.4)hdu 1258(Sum It Up——DFS)
题目大意:输入t,n,接下来有n个数组成的一个序列.输出总和为t的子序列 解题思路:DFS 代码如下(有详细的注释): #include <iostream> #include <a ...
- HDU 1258 Sum It Up(DFS)
题目链接 Problem Description Given a specified total t and a list of n integers, find all distinct sums ...
- 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) ...
- hdu 1258 Sum It Up (dfs+路径记录)
pid=1258">Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDU 1258 Sum It Up (DFS)
Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- HDU 1258 Sum It Up
Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- HDOJ(HDU).1016 Prime Ring Problem (DFS)
HDOJ(HDU).1016 Prime Ring Problem (DFS) [从零开始DFS(3)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...
- HDU 1241 Oil Deposits --- 入门DFS
HDU 1241 题目大意:给定一块油田,求其连通块的数目.上下左右斜对角相邻的@属于同一个连通块. 解题思路:对每一个@进行dfs遍历并标记访问状态,一次dfs可以访问一个连通块,最后统计数量. / ...
随机推荐
- 交换机做Channel-Group
core1#conf tEnter configuration commands, one per line. End with CNTL/Z.core1(config)#inter range g ...
- tiny4412学习一:编译uboot,体验裸机
首先,我们在ubuntu建立一个自己的文件夹,我的是: /home/wang/tiny_4412下有 datasheet shc(原理图PCB文件夹) src tools src下有 codes ...
- C#TreeView控件遍历文件夹下所有子文件夹以及文件
一直对递归的理解不深刻,有时候觉得很简单,可是用起来总会出错.这里需要在TreeView控件里显示一个文件夹下的所有目录以及文件,毫无意外的需要用到递归. 一开始,想到用递归写一个生成每一个节点(Tr ...
- java ==与equal
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(== ...
- hadoop namenpde机制
1:通过查看hadoop的临时目录,看到有fsimage和edit文件 2:fsimage时namenode的元数据内存镜像文件,edit文件时hadoop客户端的操作记录, edit_inproce ...
- AX7: Get started developing
This blog will show how you can start making a customization in AX 7 by showing you the steps needed ...
- Servlet--表单、超链接、转发、重定向4种情况的路径
Servlet中相对路径总结 假设web工程使用如下目录结构: 在介绍相对路径和绝对路径前需要先了解几个概念: 服务器的站点根目录:以tomcat服务器为例,tomcat服务器站点根目录就是apach ...
- ReactJS学习笔记(二)
1.Ajax: componentDidMount 方法设置 Ajax 请求,等到请求成功,再用 this.setState 方法重新渲染 UI. /*demo1*/ var Demo1Box=Rea ...
- buildroot使用详解
为什么要使用buildroot? (文件系统搭建,强烈建议直接用buildroot,官网[http://buildroot.uclibc.org/]上有使用教程非常详细)文件系统通常要包含很多第三方软 ...
- Appium UI自动化的那些梗
@作者 彭海波 转载请注明出处 前言 由于需求的快速迭代和敏捷测试的要求,在测试过程中引入自动化成为必不可少的手段.作为一个互联网测试团队,我们自然也引入了自动化测试这个环节.在众多的测试框架中,我们 ...