zoukankan      html  css  js  c++  java
  • 抽签

    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,放入下次递归。

  • 相关阅读:
    Android开发之Sqlite的使用
    ZOJ 3607 Lazier Salesgirl
    ZOJ 3769 Diablo III
    ZOJ 2856 Happy Life
    Ural 1119 Metro
    Ural 1146 Maximum Sum
    HDU 1003 Max Sum
    HDU 1160 FatMouse's Speed
    Ural 1073 Square Country
    Ural 1260 Nudnik Photographer
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/13809129.html
Copyright © 2011-2022 走看看