增量构造法 (白书P188)

#include<iostream>
#include<cstdio>
using namespace std;
int ans[6];
int n;

void dfs(int cnt)
{
	int i,j;
	for(i=0;i<cnt;i++) cout<<ans[i]<<" ";
	if(cnt) cout<<endl;
	int s=cnt?ans[cnt-1]+1:0;
	for(i=s;i<n;i++) {
		ans[cnt]=i;
		dfs(cnt+1);
	}
} 

int main()
{
	while(cin>>n) {
		dfs(0);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 00:13:51

增量构造法 (白书P188)的相关文章

生成子集 (增量构造法)

使用增量构造法可以构造出升序数组arr的不重复子集,并且按字典序排序 #include<bits/stdc++.h> using namespace std; int arr[16]; inline void print_subset(int *index, int cur, int n)///cur值这里可以理解为在这个堆栈层子集的集合数 { for(int i=0; i<cur; i++) {printf("%d ", arr[index[i]]);} if(cu

【算法竞赛入门经典】7.3子集生成【增量构造法】【位向量法】【二进制法】

7.3.1增量构造法 思路:一次选出一个元素放到集合中.自己对于递归的理解还是不够,这里虽然没有明确给出递归停止条件,但是如果无法继续添加元素,就不会再继续递归,然后就是我头疼的回溯啦. #include<stdio.h> int num[4],n; void A(int n,int *a,int ans) { for(int i = 0; i < ans; i ++)//打印当前元素 printf("%d ",a[i]); printf("\n"

子集生成——增量构造法+位向量法+二进制法

1.增量构造法: 原理图: 1 // 此算法仅用于输出下标,实际运用应输入另一个数组来进行数据的储存 2 #include <bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define INF 0X3f3f3f3f 7 const ll MAXN = 1e3 + 7; 8 const ll MOD = 1e9 + 7; 9 int a[10];

位向量法 (白书P188)

#include<iostream> #include<cstdio> #include<cstring> using namespace std; int ans[6],n; void dfs(int cnt) { int i,j; if(cnt==n) { for(i=0;i<n;i++) if(ans[i]) cout<<i<<" "; cout<<endl; return ; } ans[cnt]=1

子集生成——增量构造法

#include<iostream> using namespace std; int store[100]; int n; void subset(int cur,int s,int cnt){ //cnt表示子集元素的个数 if(cur==cnt){ for(int i=0;i<cur;i++){ cout<<store[i]<<" "; } cout<<endl; } else{ for(int i=s;i<=n;i++

利用子集构造法实现NFA到DFA的转换

概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够比较方便的机械实现且识别能力方面也和NFA相当.本次实验采用子集构造法来实现不带空弧的由NFA到DFA的转换. 子集构造法的算法如下: 设NFA为M=(K,Σ,f,S0,Z),则构造相应的DFA  M′=(Q,Σ,f′,I0,F)①取I0=S0:②对于状态集Q中任一尚未标记的状态qi={Si1,Si

6.12白书第五章图论总结——司雨寒

之前我的图论一直都是DFS一下,BFS一下,求个欧拉回路,拓扑排个序这种渣渣水平. 终于鼓起勇气拾起白书第五章的东西. 学(bei)习(song)了一下求双连通分量,二分图的判定,强连通分量,2-SAT. DFS加上时间戳这个东西,很强大. 最后刷了白书上的例题: BCC: LA3523 可以参加会议的是双联通分量上的奇圈 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include

Uva10474-STL水题-白书

白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cstdio> #include <vector> #include <string> #include <queue> #include

白书 5.4.3 果园的里的树

果园里的树排列成矩阵.他们的x和y的坐标均是1~99的整数.输入若干个三角形,依次统计每个三角形内部和边界上共有多少棵树. 输入: 1.5  1.5       1.5  6.8      6.8  1.5 10.7  6.9     8.5  1.5      14.5  1.5 此题用三角形有向面积来解,求有向面积2倍的函数为: double area(double x0,double y0,double x1,double y1,double x2,double,y2) { return