算法
唐火
开始人工智能之路了!!!
展开
-
数的划分
问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。输入格式 n,k输出格式 一个整数,即不同的分法样例输入7 3样例输出4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}数据规模 6 < n < =200,2<=k<=6解题思路:关键在于将此题转化为,有数a,分成b份,每份任意多原创 2021-03-07 01:16:11 · 546 阅读 · 0 评论 -
整数的分法
将整数N分成K个整数的和且每个数大于等于A 小于等于B 求有多少种分法?代码如下:#include <iostream>using namespace std;int fff(int a, int k, int mins, int maxs) { if (a < mins)//结束条件有两个,1.数值小于最小值 2.只分成一个数 return 0; if (k == 1) return 1; int res = 0; for (int i = mins; i &原创 2021-03-07 01:15:34 · 243 阅读 · 0 评论 -
m个苹果放入n个盘子问题
题目:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。输入每个用例包含二个整数M和N。0<=m<=10,1<=n<=10。0<=n<=10<=m<=10解题思路:我们首先定义dp[i][j]表示i个苹果,j个盘子的分法总数1.当盘子数多于苹果数时:则必定有j-i个盘子是空着的。dp[i,j] = dp[i,i];2.当盘子数少于苹果数时(j<=i):又原创 2021-03-07 01:15:09 · 1677 阅读 · 0 评论 -
dfs中return回溯问题
题目:从1到n中选k个数进行排列首先我们看这段代码:#include <iostream>using namespace std;int n, k;const int N = 1010;int a[N];bool st[N];void dfs(int u) { if (u == k + 1) { for (int i = 1; i <= k; i++) { cout << a[i] << " "; } cout <<原创 2021-03-07 01:12:27 · 1810 阅读 · 3 评论 -
sqrt()函数的注意事项
sqrt()函数中形参是double型,因此返回的也是double型。int a;int b;a = sqrt(b);这里的a是int型,我们在调用sqrt()函数时,要进行强制转换。代码如下:int a,b;a = (int)sqrt(b);原创 2021-03-07 00:04:12 · 1358 阅读 · 3 评论 -
完全背包问题
有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输入样例4 51 22原创 2021-03-06 00:21:04 · 96 阅读 · 0 评论 -
01背包问题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输入样例4 51 22原创 2021-03-06 00:20:36 · 92 阅读 · 1 评论 -
多重背包问题 I
有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤1000<vi,wi,si≤100输入样例4 51原创 2021-03-06 00:20:10 · 118 阅读 · 0 评论 -
青蛙跳台阶
问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:我们先定义dp[i]表示青蛙跳到i级台阶的跳法数,然后我们想到青蛙到达n级台阶的跳法有两种,一种是跳过一级台阶就跳到,一种是跳过2级台阶跳到,故关系表达式为:dp[i] = dp[i-1]+dp[i-2],现在我们考虑初始条件,比如当n = 1时,dp[1] = dp[0]+dp[-1],这里数组越界了,所以我们要考虑初始化,dp[0]表示青蛙跳到0级台阶有几种跳法,很明显,0种跳法,所以我们初原创 2021-03-06 00:19:25 · 103 阅读 · 0 评论 -
不同路径 I
一个机器人位于一个 n * m 网格的左上角 (起始点在下图中标记为“Start” )。(n表示行,m表示列)机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?数据范围:n <= 100,m <= 100;解题思路:首先我们定义dp[i][j]表示机器人走到(i,j)这个位置的走法总数,然后我们想到机器人每次只能向下或者向右移动一步,那么这个位置只可能来自上面走下来的,或者左边走过来的,故容易想到关系表达式原创 2021-03-06 00:18:55 · 108 阅读 · 0 评论 -
网格路径最小数字和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。数据范围:n <= 100,m <= 100;输入:3 31 3 11 5 14 2 1输出:7这样走,路径上的数字总和为最小解题思路:我们首先定义dp[i][j]表示从左上角到(i,j)这个点的路径上的数字的最小总和,现在我们很容易想到关系表达式为:dp[i][j] = min(dp[i - 1][j], dp[i][j -原创 2021-03-06 00:17:52 · 576 阅读 · 0 评论 -
递归实现排列型枚举
把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式一个整数 n。输出格式按照从小到大的顺序输出所有方案,每行 1 个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。数据范围1≤n≤9输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1代码如下:#include <iostream>using namespace std;const int原创 2021-03-05 00:04:09 · 147 阅读 · 1 评论 -
递归实现指数型枚举
从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数 n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。数据范围1≤n≤15输入样例:3输出样例:322 311 31 21 2 3解题思路:https://www.acwing.com/solution/content/812/题目要求要升序排原创 2021-03-05 00:03:36 · 223 阅读 · 1 评论 -
dfs递归实现组合型枚举
题目描述从自然数1,2,…,n,从中任取r个数,输出所有组合。输入一行两个自然数n、r(1<n<21,1≤r≤n)。输出所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。样例输入5 3样例输出1 2 31 2 41 2 51 3 41 3 51 4 52 3 42 3 52 4 53 4 5代码如下:#include <iostream>us原创 2021-03-02 00:07:14 · 172 阅读 · 4 评论 -
sstream应用举例
题目描述把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。代码如下:#include <iostream>#include <sstream>using namespace std;bool check(int x) { stringstream ss; ss << x; strin原创 2021-03-01 10:36:42 · 88 阅读 · 0 评论 -
ios::sync_with_stdio(false)的作用
默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,所以一般会用ios::sync_with_stdio(false)来取消cin与stdin的同步,从而使cin达到和scanf相差无几的输入效率。代码如下:ios::sync_with_stdio(false); cin.tie(0);...原创 2021-03-01 10:17:03 · 861 阅读 · 0 评论 -
递推求组合数
组合数计算公式:递推公式:代码模板:#include <iostream>using namespace std;const int N = 1010;int c[N][N];int main(){ int a,b; cin>>a>>b;//a在下,b在上 for (int i = 0;i<N;i++) for (int j = 0;j<=i;j++) { i原创 2021-02-26 21:32:27 · 452 阅读 · 0 评论 -
C++map容器应用举例
维护一个集合,支持如下几种操作:“I x”,插入一个数x;“Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。输出格式对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。每个结果占一行。数据范围1≤N≤10^5−109≤x≤109输入样例:5I 1I 2I 3Q 2原创 2021-02-26 19:15:02 · 120 阅读 · 0 评论 -
单链表式并查集应用举例
给定一个长度为 N 的数组 A=[A1,A2,⋅⋅⋅AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改 A2,A3,⋅⋅⋅,AN。当修改 Ai 时,小明会检查 Ai 是否在 A1∼Ai−1 中出现过。如果出现过,则小明会给 Ai 加上 1;如果新的 Ai 仍在之前出现过,小明会持续给 Ai 加 1,直到 Ai 没有在 A1∼Ai−1 中出现过。当 AN 也经过上述修改之后,显然 A 数组中就没有重复的整数了。现在给定初始的 A 数组,请你计算出原创 2021-02-26 00:16:52 · 141 阅读 · 0 评论 -
C++手写a除以b的正余数
代码如下:int get_mod(int a,int b){ return (a%b+b)%b;}原创 2021-02-25 21:49:57 · 669 阅读 · 0 评论 -
C++string容器应用举例
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。输入格式输入共1行,1个整数N。输出格式输出共1行,1个整数表示反转后的新数。代码如下:#include <iostream>#include <cstring>#include <algorithm>using namespace std;int main(){ string a; ci原创 2021-02-25 01:51:21 · 95 阅读 · 0 评论 -
C++to_string应用举例
给定一个非负整数 N,你的任务是计算 N 的所有数字的总和,并以英语输出总和的每个数字。输入格式共一行,包含一个整数 N。输出格式共一行,用英语输出总和的每个数字,单词之间用空格隔开。代码如下:#include <iostream>#include <cstring>using namespace std;string d[] = {"zero","one","two","three","four","five","six","seven","eight","nin原创 2021-02-25 01:44:13 · 192 阅读 · 0 评论 -
C++unique函数应用举例
明明想在学校中请一些同学一起做一项问卷调查。为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。输入格式输入文件包含2行,第1行为1个正整数,表示所生成的随机数的个数:N 。第2行有N个用空格隔开的正整数,为所产生的随机数。输出格式输出文件也是2行,第1行为1个正整数M,表示不相同的随机数的个数原创 2021-02-25 01:12:44 · 152 阅读 · 0 评论 -
哈希表应用举例
例题:伊娃喜欢从整个宇宙中收集硬币。有一天,她去了一家宇宙购物中心购物,结账时可以使用各种硬币付款。但是,有一个特殊的付款要求:每张帐单,她只能使用恰好两个硬币来准确的支付消费金额。给定她拥有的所有硬币的面额,请你帮她确定对于给定的金额,她是否可以找到两个硬币来支付。输入格式第一行包含两个整数 N 和 M,分别表示硬币数量以及需要支付的金额。第二行包含 N 个整数,表示每个硬币的面额。输出格式输出一行,包含两个整数 V1,V2,表示所选的两个硬币的面额,使得 V1≤V2 并且 V1+V2=原创 2021-02-23 16:40:49 · 358 阅读 · 0 评论 -
区间合并
区间合并算法:1.将所有区间按左端点从小到大排序2.从左到右遍历每个区间例题:某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是原创 2021-02-23 16:02:46 · 94 阅读 · 0 评论 -
10进制转换成其他进制-短除法
将10进制下的n转换成b进制下的数。代码如下:char get(int x){ if (x<=9) return x+'0'; return x-10+'A';}string base(int n,int b){ string num; while(n) num += get(n%b),n/=b; reverse(num.begin(),num.end()); return num;}例题:回文数是指数字从前往后读和从后往前读都相同原创 2021-02-23 02:39:25 · 863 阅读 · 2 评论 -
C++手写gcd函数
C++< cmath >库中的求最大公因数__gcd函数手写如下:int gcd(int a,int b){ return b?gcd(b,a%b):a;}原创 2021-02-21 03:10:20 · 1519 阅读 · 0 评论 -
树状数组
int lowbit(int x){ return x & -x;}void add(int x,int v){ for (int i = x;i<=n;i+=lowbit(i)) { tr[i] +=v; }}int query(int x){ int res = 0; for (int i = x;i;i-=lowbit(i)) { res +=tr[i]; } ret原创 2021-02-21 15:56:34 · 77 阅读 · 0 评论