元素的组合(dfs)
无重复元素的组合
输入一串小些字母(无重复字母),从中取出k(k<10)个字母,输出组合情况。
样例:
输入:
abcd
3
输出:
abc
abd
acd
bcd
一道搜索的题,想办法建图或是画搜索树。
这里推荐建图的方法,因为是组合情况,不用考虑顺序,也就是说,元素一样,顺序不一样算同一种组合。
那么为了避免重复组合,就应该规定一个组合顺序,比如ASCII值从小到大。
那么这道题的图就是一个有向图的遍历了。

从每一个结点开始遍历,累计遍历到结点数等于k时,输出。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i, a, n) for(int i = a; i <= n; ++i)
#define per(i, n, a) for(int i = n; i >= a; --i)
typedef long long ll;
int len, k, tot = ;
char a[], ans[];
int vis[];
void print(int tot)
{
rep(i, , k) printf("%c", ans[i]); printf("\n");
}
void solve(char id, int step)
{
if(step == k + ) print(++tot);
for(int i = id; i <= 'z'; ++i) //从这个结点的ASCII值开始,尝试走到所有比他大的结点
{
if(vis[i]) //结点存在
{
ans[step] = i; vis[i] = ;
solve(i, step + );
vis[i] = ;
}
}
} int main()
{
// freopen("p4.in", "r", stdin);
// freopen("p4.out", "w", stdout);
scanf("%s%d", a, &k);
len = strlen(a);
sort(a, a + len);
rep(i, , len - ) vis[a[i]] = ;
solve('a', );
return ;
}
有重复元素的组合
输入一串小些字母(有重复字母),从中取出k 个字母,输出组合情况。
样例:
输入:
aabbcc
4
输出:
1:aabb
2:aabc
3:aacc
4:abbc
5:abcc
6:bbcc
这下元素有重复了,若还是按上述方式建图

会发现,从结点a有三条出边b(左下),b(右下),c。而从左下角的b走到c,和从右下角的b走到c得到的组合相同。所以对于每一个结点的出边指向的结点,其种类应该是两两不相同的,也就是说,图应该改为这样

然后遍历所有点就行了。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i, a, n) for(int i = a; i <= n; ++i)
#define per(i, n, a) for(int i = n; i >= a; --i)
typedef long long ll;
int len, k, tot = ;
char a[], ans[];
int vis[];
void print(int tot)
{
printf("%d:", tot);
rep(i, , k) printf("%c", ans[i]); printf("\n");
}
void solve(char id, int step)
{
if(step == k + ) print(++tot);
for(int i = id; i <= 'z'; ++i)
{
if(vis[i])
{
ans[step] = i; vis[i]--; //该点走过了
solve(i, step + );
vis[i]++;
}
}
} int main()
{
// freopen("p5.in", "r", stdin);
// freopen("p5.out", "w", stdout);
scanf("%s%d", a, &k);
len = strlen(a);
sort(a, a + len);
rep(i, , len - ) vis[a[i]]++;
solve('a', );
return ;
}
元素的组合(dfs)的更多相关文章
- PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?
首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...
- 使用回溯法求所有从n个元素中取m个元素的组合
不多说了,直接上代码,代码中有注释,应该不难看懂. #include <stdlib.h> #include <stdio.h> typedef char ELE_TYPE; ...
- 51nod 1268 和为K的组合 dfs
题目: 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K.如果可以,输出:& ...
- 砝码组合(dfs)
砝码组合 题目内容:用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两 ...
- php数组全排列,元素所有组合
<?php $source = array('pll','我','爱','你','嘿'); sort($source); //保证初始数组是有序的 $last = count($source) ...
- hdu 1258 从n个数中找和为t的组合 (DFS)
题意:首先给你一个t,然后是n,后面输入n个数,然后让你求的是n个数中和为t的序列总共有多少种,把他们按从左到右的顺序输出来. Sample Input4 6 4 3 2 2 1 15 3 2 1 1 ...
- noip 1995 灯的排列问题 排列组合 DFS
题目描述 设在一排上有N个格子(N≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N1,N2,……Nk(k表示不同颜色灯的个数). 放灯时要遵守下列规则: ①同一种颜色的灯不能分开: ②不同颜 ...
- javascript数组全排列,数组元素所有组合
function permute(input) { var permArr = [], usedChars = []; function main(input){ var i, ch; for (i ...
- N个数组中所有元素的排列组合(笛卡尔积)算法
(1)N个数组对象中所有元素排列组合算法 private List<List<Object>> combineAlg(List<Object[]> nArray) ...
随机推荐
- Freemarker教程1(基本使用)
简介 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是 ...
- Mybatis 与hibernate
共同点 (1)Hibernate与MyBatis都是通过SessionFactoryBuider由XML配置文件生成SessionFactory,由SessionFactory 生成Session,由 ...
- java——线程
线程与进程 1.线程:程序中单独顺序的控制流 线程本身是通过程序进行运行 线程是程序中的顺序控制流,只能使用分配给程序的资源与环境 2.进程:执行中的程序 一个进程可以包含一个或多个线程 一个进程至少 ...
- 使用Java解析XML
一.解析的对象 <?xml version="1.0" encoding="UTF-8"?> <users> <user id=& ...
- 秒懂AOP
AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 ...
- Flash饼状图统计代码
index.html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- canvas-2lineCap.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 洛谷P4562 [JXOI2018]游戏(组合数学)
题意 题目链接 Sol 这个题就比较休闲了. \(t(p)\)显然等于最后一个没有约数的数的位置,那么我们可以去枚举一下. 设没有约数的数的个数有\(cnt\)个 因此总的方案为\(\sum_{i=c ...
- 2017-10-10 都市传说: "部分"中文出现乱码
知乎原链, 作者亦本人 事情起源于项目另一开发者在中文Windows下构建时遇到的部分中文出现乱码问题. 当时很不解的是, 为什么会只有部分出现乱码. 第一感觉是, 如果编码转换不正确, 要么全乱码, ...
- React自己写的一个地图小组件
由于今天比较闲,就玩了玩react,然后就封装了一个地图的组件,当然功能比较简单,因为就是随手写的小东西,但是由于引用了百度API和bee-mobile,所以用起来可能要薛微麻烦一点点,但是我保证,只 ...