• 抽签


    X星球要派出一个5人组成的观察团前往W星。
    其中:
    A国最多可以派出4人。
    B国最多可以派出2人。
    C国最多可以派出2人。
    ....

    那么最终派往W星的观察团会有多少种国别的不同组合呢?

    下面的程序解决了这个问题。
    数组a[] 中既是每个国家可以派出的最多的名额。
    程序执行结果为:
    DEFFF
    CEFFF
    CDFFF
    CDEFF
    CCFFF
    CCEFF
    CCDFF
    CCDEF
    BEFFF
    BDFFF
    BDEFF
    BCFFF
    BCEFF
    BCDFF
    BCDEF
    ....
    (以下省略,总共101行)

    include <stdio.h>

    define N 6

    define M 5

    define BUF 1024

    void f(int a[], int k, int m, char b[])
    {
    int i,j;

    if(k==N){ 
    	b[M] = 0;
    	if(m==0) printf("%s
    ",b);
    	return;
    }
    
    for(i=0; i<=a[k]; i++){
    	for(j=0; j<i; j++) b[M-m+j] = k+'A';
    	______________________;  //填空位置
    }
    

    }
    int main()
    {
    int a[N] = {4,2,2,1,1,3};
    char b[BUF];
    f(a,0,M,b);
    return 0;
    }
    解释一下代码:
    void f(int a[], int k, int m, char b[])函数中可知a[]和b[]不变,而k和m是变化的。
    然后看难理解的这段代码:
    for(i=0; i<=a[k]; i++)
    {
    for(j=0; j<i; j++)
    b[M-m+j] = k+'A';

    	f(a,k+1,m-i,b);
    }
    

    a[]数组是说第K个星球能派出的人数,第二个for是向b[]中加入几个本国的字符(A国字符是A、B国字符是B...)加完后,b[]数组被占用了i个,m表示b中剩余多少空间,M-m就表示前多少空间被占用了(M是需要的总空间嘛),M-m+j就是从被占用的空间后面接着装入数组。
    下面递归,f(a,k+1,m-i,b); k+1是下一个国家,m-i是因为这次使用了i个空间,以前剩余m,用了i,现在剩余m-i,放入下次递归。

  • 相关阅读:
    tree-cli 自动生成项目目录结构
    按需导入vant-ui
    全局导入vant-ui
    mook使用流程
    axios使用流程
    Vuex使用流程
    vue-router使用流程
    img的complete和onload
    react-redux 如何在子组件里访问store对象
    ES6中的Export/import操作的是引用
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/13809129.html
Copyright © 2020-2023  润新知