【java/算法/组合】在3男6女中选5人参加活动,要求男女都有。则不同的选取方式有几种?并列出符合条件的名单
【数学解法】
9人选5人是C95;
如果5人中全选女孩就不合条件,所以C65是要排除在外的;
总数Sum=9*8*7*6*5/5/4/3/2/1-6*5*4*3*2/5/4/3/2/1=126-6=120种。
【代码解法】
将三男六女作成数组,用组合器从中选取5个,符合有男有女则入选。
比如把数组定为"勇","力","刚","芳","雪","梦","曼","燕","娇",明显下标小于3者为男,大于等于3者为女。
Activity类代码:
import java.util.List; /** * 在3男6女中选5人参加活动,要求男女都有。则不同的选取方式有几种?并列出符合条件的名单 */ public class Activity { public static void main(String[] args) { final String[] names= {"勇","力","刚","芳","雪","梦","曼","燕","娇"}; final int[] arr= {0,1,2,3,4,5,6,7,8}; Combination c=new Combination(arr,5); List<List<Integer>> results=c.getResults(); int idx=0; for(List<Integer> res:results) { boolean hasBoy=false; boolean hasGirl=false; String nameSery=""; for(int index:res) { if(hasBoy==false && index<3) { hasBoy=true; } if(hasGirl==false && index>=3) { hasGirl=true; } nameSery+=names[arr[index]]; } if(hasBoy && hasGirl) { System.out.println(String.format("%03d", ++idx) +"."+nameSery); } } } }
Combination类代码:
package test230425; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * 数学中排列组合中的组合器实现 * */ public class Combination { /** * 用于存放中间结果 */ private Stack<Integer> stack; /** * 用于存放结果 */ private List<List<Integer>> results; /** * 构造函数 * @param arr 进行组合的元素 * @param count 选多少个 */ public Combination(int[] arr,int count) { if(count>arr.length) { throw new ArrayIndexOutOfBoundsException(count+">"+arr.length); } stack = new Stack<>(); results=new ArrayList<>(); doSelect(arr,count,0,0); } /** * 进行选择 * @param arr 目标数组 * @param expect 期望选择数量 * @param actual 实际选择数量 * @param current 当前下标 */ private void doSelect(int[] arr, int expect, int actual, int current) { if(actual == expect) { List<Integer> list=new ArrayList<>(); for(int i:stack) { list.add(i); } results.add(list); return; } for(int i=current;i<arr.length;i++) { if(!stack.contains(arr[i])) { stack.add(arr[i]); doSelect(arr, expect, actual+1, i); stack.pop(); } } } /** * 取得组合结果 * @return */ public List<List<Integer>> getResults(){ return results; } /** * 测试 * @param args */ public static void main(String[] args) { final int[] arr= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}; final int count=2; Combination c=new Combination(arr,count); List<List<Integer>> results=c.getResults(); int idx=0; for(List<Integer> res:results) { System.out.println(String.format("%02d", ++idx) +"."+res); } } }
【输出】
001.勇力刚芳雪
002.勇力刚芳梦
003.勇力刚芳曼
004.勇力刚芳燕
005.勇力刚芳娇
006.勇力刚雪梦
007.勇力刚雪曼
008.勇力刚雪燕
009.勇力刚雪娇
010.勇力刚梦曼
011.勇力刚梦燕
012.勇力刚梦娇
013.勇力刚曼燕
014.勇力刚曼娇
015.勇力刚燕娇
016.勇力芳雪梦
017.勇力芳雪曼
018.勇力芳雪燕
019.勇力芳雪娇
020.勇力芳梦曼
021.勇力芳梦燕
022.勇力芳梦娇
023.勇力芳曼燕
024.勇力芳曼娇
025.勇力芳燕娇
026.勇力雪梦曼
027.勇力雪梦燕
028.勇力雪梦娇
029.勇力雪曼燕
030.勇力雪曼娇
031.勇力雪燕娇
032.勇力梦曼燕
033.勇力梦曼娇
034.勇力梦燕娇
035.勇力曼燕娇
036.勇刚芳雪梦
037.勇刚芳雪曼
038.勇刚芳雪燕
039.勇刚芳雪娇
040.勇刚芳梦曼
041.勇刚芳梦燕
042.勇刚芳梦娇
043.勇刚芳曼燕
044.勇刚芳曼娇
045.勇刚芳燕娇
046.勇刚雪梦曼
047.勇刚雪梦燕
048.勇刚雪梦娇
049.勇刚雪曼燕
050.勇刚雪曼娇
051.勇刚雪燕娇
052.勇刚梦曼燕
053.勇刚梦曼娇
054.勇刚梦燕娇
055.勇刚曼燕娇
056.勇芳雪梦曼
057.勇芳雪梦燕
058.勇芳雪梦娇
059.勇芳雪曼燕
060.勇芳雪曼娇
061.勇芳雪燕娇
062.勇芳梦曼燕
063.勇芳梦曼娇
064.勇芳梦燕娇
065.勇芳曼燕娇
066.勇雪梦曼燕
067.勇雪梦曼娇
068.勇雪梦燕娇
069.勇雪曼燕娇
070.勇梦曼燕娇
071.力刚芳雪梦
072.力刚芳雪曼
073.力刚芳雪燕
074.力刚芳雪娇
075.力刚芳梦曼
076.力刚芳梦燕
077.力刚芳梦娇
078.力刚芳曼燕
079.力刚芳曼娇
080.力刚芳燕娇
081.力刚雪梦曼
082.力刚雪梦燕
083.力刚雪梦娇
084.力刚雪曼燕
085.力刚雪曼娇
086.力刚雪燕娇
087.力刚梦曼燕
088.力刚梦曼娇
089.力刚梦燕娇
090.力刚曼燕娇
091.力芳雪梦曼
092.力芳雪梦燕
093.力芳雪梦娇
094.力芳雪曼燕
095.力芳雪曼娇
096.力芳雪燕娇
097.力芳梦曼燕
098.力芳梦曼娇
099.力芳梦燕娇
100.力芳曼燕娇
101.力雪梦曼燕
102.力雪梦曼娇
103.力雪梦燕娇
104.力雪曼燕娇
105.力梦曼燕娇
106.刚芳雪梦曼
107.刚芳雪梦燕
108.刚芳雪梦娇
109.刚芳雪曼燕
110.刚芳雪曼娇
111.刚芳雪燕娇
112.刚芳梦曼燕
113.刚芳梦曼娇
114.刚芳梦燕娇
115.刚芳曼燕娇
116.刚雪梦曼燕
117.刚雪梦曼娇
118.刚雪梦燕娇
119.刚雪曼燕娇
120.刚梦曼燕娇
END