元素的组合(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) ...
随机推荐
- 多继承之MRO
一,python2和python3的区别 在python2中存在两种类:一个叫经典类,在python2.2之前,一直用的是经典类,经典类如果在基类的根什么都不写,那么它就是根:还有一个叫新式类,在py ...
- SQL Server中锁与事务隔离级别
SQL Server中的锁分为两类: 共享锁 排它锁 锁的兼容性:事务间锁的相互影响称为锁的兼容性. 锁模式 是否可以持有排它锁 是否可以持有共享锁 已持有排它锁 否 否 已持有共享锁 否 是 SQL ...
- 聚簇索引(聚集索引) 不可作用于GUID类型字段
聚簇索引(又名聚集索引) 不可作用于GUID类型字段,即:数据库中不要把GUID类型作为主键或设置为聚集索引. 聚集索引:索引的物理存储顺序与数据表中行数据物理存储顺序一致(索引存储物理有序). 非聚 ...
- STM32F4 MDK5软件仿真 error : no 'read' permission
问题描述 CPU:STM32F407 MDK5软件模拟提示没有读写权限,只能一步一步运行.提示代码如下: *** error 65: access violation at 0x40023800 : ...
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...
- Spring中四种实例化bean的方式
本文主要介绍四种实例化bean的方式(注入方式) 或者叫依赖对象实例化的四种方式.上面的程序,创建bean 对象,用的是什么方法 ,用的是构造函数的方式 (Spring 可以在构造函数私有化的情况下把 ...
- webpack4 系列教程(六): 处理SCSS
这节课讲解webpack4中处理scss.只需要在处理css的配置上增加编译scss的 LOADER 即可.了解更多处理css的内容 >>> >>> 本节课源码 & ...
- tortoisegit安装
1.下载tortoisegit:https://tortoisegit.org/download/ 2.下载git 64位 3. 双击开始安装,选择默认,点击下一步 4.接着是选择安装目录,可以保持默 ...
- JS日期Date详解与实例扩展
一:Date类型介绍 要创建一个日期对象,使用new操作符和Date构造函数即可: var now = new Date(); Date.parse()方法 其中Date.parse()方法接收一个表 ...
- Python3选择支持非ASCII码标识符的缘由
原文在: PEP 3131 -- Supporting Non-ASCII Identifiers. Python2并不支持非ASCII码标识符. PEP的全称是Python Enhancement ...