1.数的划分

点击查看搜索
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,a[100];
void dfs(int x,int y,int z)//shu zong wei
{
if(y>n)return;
if(y==n)
{
for(int i=1;i<z;i++)//不取等
{
printf("%d ",a[i]);
}
printf("\n");
return;
}
for(int i=x;i<n;i++)
{
a[z]=i;
dfs(i,y+i,z+1);
}
}
int main()
{
scanf("%d",&n);
dfs(1,0,1);
return 0;
}
点击查看递推
/*把n看成是n个小球,k看成是k个盒子

  那么题目就变成了把n小球放到k个盒子,且每个盒子都至少有1个小球的问题。

  那么把n个小球放到k个盒子里的情况总数 = 1.至少有1个盒子放1个小球的情况总数 + 2.每个盒子都有多于1个小球的情况总数

  那么这里 1 相当于 把n-1个小球放到k-1个盒子里的情况总数

  2 相当于 把n-k个小球放到k个盒子里的情况总数

  到了这里就可以发现是递推咯。

  公式为 f(n,k) = f(n-1,k-1) + f(n-k,k)
*/
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n, k, f[205][10];
int main() {
scanf("%d%d", &n, &k);//不太一样,划分成k个数
for (int i = 1; i <= n; i++) {
f[i][1] = 1;
}
for (int i = 2; i <= k; i++) {
f[i][i] = 1;
for (int j = i + 1; j <= n; j++) {
f[j][i] += f[j - 1][i - 1] + f[j - i][i];
}
}
printf("%d", f[n][k]);
return 0;
}

2.组合数的输出

点击查看代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,a[100];
bool b[100];
void print()
{
for(int i=1;i<=m;i++)printf("%d ",a[i]);
printf("\n");
return;
}
int dfs(int x,int y)
{
if(y>m) print();
else
{
for(int i=x;i<=n;i++)
{
a[y]=i;
dfs(i+1,y+1);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
dfs(1,1);
return 0;
}

3.拔河比赛

详见Ybtoj

当然重点在于搜索都配有板子了

点击查看1
int search(int k)
{
for(int i=1;i<=n;i++)
{
if()//合法
{
//保存
if()//终点
{
ans++;
print();
}
else search(++k);
}
//恢复(回溯)
}
}
点击查看2
int search(int k)
{
if()//
{
ans++;
print();
}
else for(int i=1;i<=n;i++)
{
if()
{
//
search(++k);
//
}
}
}

注意场宽 && STL大法好

题目描述

第一行:n

第二行:n个字符(有重复)

输出:全排列+方案数

思路:把单一的 vis[i] 换为累加器数组

STL大法好
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string.h>
#include<algorithm>
int n;
char s[30];
int main()
{
long long ans = 0;
scanf("%d",&n);
scanf("%s",s+1);
std::sort(s+1,s+n+1);
do{
for(int i=1;i<=n;i++) printf("%c",s[i]);
printf("\n");
++ans;
}while(std::next_permutation(s+1,s+n+1));
printf("%lld\n", ans);
return 0;
}
正解
#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
int n , ans = 0;
char s[100];
bool same( int t, int k) {
for(int i = t; i < k; ++i) {
if(s[k] == s[i]){
return 0;
}
}
return 1;
}
void print()
{
for(int i = 0; i < n; i++) {
printf("%c",s[i]);
}
printf("\n");
}
void dfs(int t) {
if(t == n-1) {
print();
ans++;
}
for(int i = t; i < n; ++i){
if(same(t, i)) {
swap(s[i], s[t]);
dfs( t + 1 );
swap(s[i], s[t]);
}
}
}
int main() {
scanf("%d",&n);
cin >> s;
dfs( 0);
printf("%d",ans);
return 0;
}

//数组尽量开大一点

dfs+search的更多相关文章

  1. 1923. Scary Politics (timus) (dfs) search

    http://acm.timus.ru/problem.aspx?space=1&num=1923 -- timus This is s problem about thd dfs and s ...

  2. Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

    1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputin ...

  3. [LeetCode#212]Word Search II

    Problem: Given a 2D board and a list of words from the dictionary, find all words in the board. Each ...

  4. Leetcode: Android Unlock Patterns

    Given an Android 3x3 key ≤ m ≤ n ≤ , count the total number of unlock patterns of the Android lock s ...

  5. PE刷题记录

    PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...

  6. Android Unlock Patterns

    Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...

  7. Trie for string LeetCode

    Trie build and search class TrieNode { public: TrieNode * next[]; bool is_word; TrieNode(bool b = fa ...

  8. 582. Kill Process

    Problem statement: Given n processes, each process has a unique PID (process id) and its PPID (paren ...

  9. Leetcode: Closest Leaf in a Binary Tree

    Given a binary tree where every node has a unique value, and a target key k, find the value of the n ...

随机推荐

  1. nvm切换node版本出现乱码 exit status 1:

    nvm切换nodejs版本出现exit status 1:乱码 跟着网上的教程一步一步做,还是出现问题.浪费一下午的时间 最后发现却因为我没用CMD管理员权限运行 扑街 解决方法: 用管理员身份运行就 ...

  2. 《剑指offer》面试题32 - III. 从上到下打印二叉树 III

    问题描述 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20, ...

  3. leetcode 55. 跳跃游戏 及 45. 跳跃游戏 II

    55. 跳跃游戏 问题描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...

  4. 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式

    摘要:工厂模式是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性. 本文分享自华为云社区<[Java设计模式]用 披萨订购案例 详 ...

  5. C++与lua交互之C++访问lua

    假设lua中: name="gzw" id=17010805 sex=man tab={ num=100, str="hello" } foo_one=func ...

  6. listen()和accept()

    1.listen()队列剖析 作用:监听端口,TCP连接中的服务器端角色 调用格式:int listen(int sockfd, int backlog); 第一个参数:创建的sockfd, 好好理解 ...

  7. 使用MobaXterm发布服务器项目文件

    注:笔记旨在记录 目录 一.使用MobaXterm登录服务器 二.后端发布 三.前端发布 一.使用MobaXterm登录服务器 打开MobaXterm,点击左上角Session->SSH,输入账 ...

  8. 不难懂——th: 的常用标签

    关键字>       功能介绍    >      案例 th:id 替换id <input th:id="'xxx' + ${collect.id}"/> ...

  9. PyCharm专业版破解教程

    破解步骤: 1. 下载激活包和注册码:https://pan.baidu.com/s/1_1nrQdTElf4aEg8vGnMTzg 2. 将下载的破解包放入PyCham安装目录的bin文件夹中 3. ...

  10. Dart 2.16 现已发布

    文 / Michael Thomsen, Dart 产品经理 Dart 2.16 正式发布 Dart 2.16 正式版已于上周发布.尽管没有新的语言特性加入,但本次版本发布包含了数个问题修复 (包括对 ...