18-从n个数中选m个

#include <iostream>
using namespace std;

int f(int n, int m){
    
    if(n < m)         //这个条件必须先判断,因为递归时n-1了,可能有这种情况
        return 0;     
    if(m == 1)
        return n;
    if(n == 1)
        return 1;
    
    return f(n - 1, m - 1) + f(n - 1, m);    //根据考虑最后一个选不选来递归
}

int main(){
    int n, m;
    cin >> n >> m;
    cout << f(n, m);
    return 0;
}

时间: 2024-10-12 08:52:52

18-从n个数中选m个的相关文章

递归实现从n个数中选r个数的组合数

1 #include <stdio.h> 2 #include <stdlib.h> 3 int a[100], count; 4 void comb(int m, int k) 5 { 6 int i, j; 7 for(i = m; i >= k; --i) 8 { 9 // 用来存储每个组合中的数据 10 a[k] = i; 11 if(k > 1) 12 comb(i - 1, k - 1); 13 else 14 { 15 for(j = a[0]; j &g

9.18 判断一个数是否是回文数

[题目]: 定义回文数的概念如下: 1.如果一个非负数左右完全对应,则该数是回文数,例如:121,22等 2.如果一个负数的绝对值左右完全对应,也是回文数,例如:-121,-22等 给定一个32位整数num,判断num是否是回文数 题目来源:左程云老师<程序员代码面试指南> 原文地址:https://www.cnblogs.com/latup/p/10204849.html

n个数分为两组,两组数的个数尽可能相等,差值最小

题目描述:对于有n个数的数组,分为两组,这两组的数的个数尽可能相等(不超过1),同时两组的数之和的差值最小. 这个题目使用类似0-1背包问题,思路:从k个数中选i个数,求所有可能的和,并把这些和放在flag中用true表示.(k,i,flag见代码) 1 public static void main(String[] args){ 2 int[] arr = {1 , 2 , 3 , 5 , 7 , 8 , 9}; 3 int n = 7; 4 int sum = 0; 5 for(int i

组合数学 - 组合数的个数

组合数的个数 输入一个n,然后输入n个一位数,求这n个数组成的不重复出现的整数的总和. Mean: 略 analyse: 这样的数可以是1~n位,总共数的数目为:P(n,1)+p(n,2)+p(n,3)+.....+p(n,n)个.(其中p(n,m)表示从n个数中选m个数组成的排列的数目). 若将这些数全部罗列出来再来求和,这不是一个好办法.其实我们可以将个位的和a1求出来,然后十位的和a2求出来,然后百位,然后千位......直到第n-1位. 那么最后的和就是: sum=a1*1+a2*10^

n个数的最大公约、最小公倍数

1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 #define N 1010 5 6 //两个数的最大公约数和最小公倍数 7 __int64 Gcd(__int64 a, __int64 b) 8 { 9 if(b==0) 10 return a; 11 return Gcd(b, a%b); 12 } 13 14 __int64 Lcm(__int64 a, __int64 b) 15 { 16

Gym -102007 :Benelux Algorithm Programming Contest (BAPC 18) (寒假自训第5场)

A .A Prize No One Can Win 题意:给定N,S,你要从N个数中选最多是数,使得任意两个之和不大于S. 思路:排序,然后贪心的选即可. #include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=2000010; ll a[maxn]; int main() { int N,ans; l

信息学奥赛一本通 提高篇 序列第k个数 及 快速幂

我是传送门 这个题首先是先判断是等差还是等比数列 等差的话非常简单: 前后两个数是等差的,举个栗子: 3 6 9 12 这几个数,(我感觉 1 2 3 4并说明不了什么) 每次都加3嘛,很容易看出,第一个数是3 * 1,第二个是3 * 2....以此类推 第k个数 = (第2个数 - 第1个数) * k ; (z - y) * k % 200907 % 200907 的原因是题目要求 但是这样并不能过 hack一下 4 7 10 13 用原先的公式:(7 - 4) * 4 % 200907 =

【Foreign】开锁 [概率DP]

开锁 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 4 5 1 2 5 4 3 1 5 2 2 5 4 3 1 5 3 2 5 4 3 1 5 4 2 5 4 3 1 Sample Output 0.000000000 0.600000000 0.900000000 1.000000000 HINT Main idea 一个宝箱内有一个可以开启别的宝箱的钥匙,可以选择k个宝箱,询问能开

组合问题的递归实现

算法说明:从n个数中选m个数,可以分解为以下两步 (1)首先从n个数中选取编号最大的数,然后在剩下的n-1个数中选取m-1个数,直到从n-(m-1)个数中选取1个数为止. (2)从n个数中选取编号次小的一个数,继续执行第(1)步,直到当前可选编号最大的数为m. 1 #include <iostream> 2 3 using namespace std; 4 5 void Combine(int a[], int n ,int m, int b[], const int M); 6 7 int