对N各集合中的任意元素进行排列组合问题
小李去市场买菜,有蔬菜(茄子、黄瓜、大白菜...等k中素菜),和肉类(牛肉,羊肉,鸡肉...等m种荤菜),及点心(麻饼,桃酥,枣花...等n中点心),现在老婆要求每天一荤一素一点心 并且每天的样式要尽可能不重复,这样子有多少中买菜的方案。
问题转化为排列组合问题就是,已知存在N个集合S1、S2.....Sn,每个集合各有m1、m2......mn各元素。依次有序从各个集合当中任意取一个元素,生成集合取样的全排列。
使用递归算法进行实现:
<span style="font-size:18px;">package optmize; import java.util.ArrayList;
import java.util.List; public class Permutate {
/**保存生成的排列组合内容**/
public List<String> Permutation = new ArrayList<String>();
/**
* 递归的方式计算排列组合
* @param list 传入list.size()个集合
* @param preStr 上一步递归中生成的排列组合
* @return
*/
public void permutation( List<List<String>> list,String preStr) {
int size = list.size();
if(1==size){
for(int i=0; i<list.get(0).size(); i++) {
Permutation.add(preStr + list.get(0).get(i));
}
}
else{
List<String> permu = new ArrayList<String>(list.get(0));
List<List<String>> now = new ArrayList<List<String>>(list);
now.remove(0);
for(int i=0; i<permu.size(); i++){
permutation(now, preStr +permu.get(i));
}
}
} public static void main(String[] args) throws Exception {
List<List<String>> list = new ArrayList<List<String>>();
List<String> SET1 = new ArrayList<String>();
SET1.add("茄子");
SET1.add("大白菜");
List<String> SET2 = new ArrayList<String>();
SET2.add("牛肉");
SET2.add("羊肉");
List<String> SET3 = new ArrayList<String>();
SET3.add("桃酥");
SET3.add("麻饼");
list.add(SET1);
list.add(SET2);
list.add(SET3); Permutate permutate = new Permutate();
permutate.permutation(list,"");
System.out.println(permutate.Permutation);
} }</span>
对N各集合中的任意元素进行排列组合问题的更多相关文章
- 判断IEnumerable<T>集合中是否包含有T对象
比如,有角色集合中,只有用户创建有角色,才出现“分配”铵钮.反之,隐藏. IEnumerable有一个方法,叫Any:
- java范型集合中的成员排序
范型集合中的类是JsonObject,不是自定义类,如果是自定义类就直接取要比较的字段值. ArrayList<JSONObject> TList = new ArrayList<J ...
- POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)
实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...
- java集合中List与set的区别
java集合中List与set的区别. List可以存储元素为有序性并且元素可以相同. set存储元素为无序性并且元素不可以相同. 下面贴几段代码感受一下: ArrayL ...
- C# List泛型集合中的GroupBy<>用法
//根据子项目id得到flowjump实体类 flowJumps = this.FlowJumps; //按工序groupby flowjumps IEnumerable<IGrouping&l ...
- JAVA求集合中的组合
好几个月没弄代码了,今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00].然后根据 ...
- 一句话的代码,从集合中找出第一个重复字符的方法javascript版。
有的时候需求是这样的: 找出集合中第一个重复的字符所在的位置,刚才看了园内某自许为算法的代码,感觉非常之啰嗦故写了以下代码! 本人对神马算法之类的完全不懂,但那些伪算法家们也别出来装蒜.一句话:不要欺 ...
- Java集合中Comparator和Comparable接口的使用
在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...
- Java集合中Set的常见问题及用法
在这里演示的案例是衔接Java集合中的List(点击查看)那篇博文的,本节我们学习的Set的用法. Set是Collection的一个重要的子接口,Set中的元素是无序排列的,并且元素不可以重复,被称 ...
随机推荐
- 51 nod 1427 文明 (并查集 + 树的直径)
1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...
- hdu 5476 (计算几何)
题意:求三角形内∠MPB+∠APC=∠MPC+∠APB的轨迹长度- - 1.基于M的中垂线 2.三角形内的圆弧(比赛只有看自己能否猜中),ps.以下是别人家的证明 #include < ...
- bzoj3944Sum
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5149 Solved: 1385[Submit][Status][Discuss ...
- 习题9-8 Uva1632
题意: 给你n个宝藏,然后给出他们的位置a[i]以及存在时间tim[i],如果能全部拿完,求出最短时间: 否则输出No solution 思路: 对于一段区间[i,j],你取完之后肯定是在最左端或者最 ...
- hdu5586 BestCoder Round #64 (div.2)
问题描述 给n个数{A}_{1},{A}_{2}....{A}_{n}A1,A2....An,你可以选择一个区间(也可以不选),区间里每个数x变成f(x),其中f(x)=(1890x ...
- 一个小小的抽奖活动测试脚本(python2.7)
# coding=utf-8import requestsimport cx_Oracletns=cx_Oracle.makedsn('172.30.0.155',1521,'szdev')db1=c ...
- diango-团队介绍
1.使用django-admin startproject show创建项目,并使用python manage.py startapp team_show创建应用 2.进行相关的配置 3.代码的实现
- RabbitMQ环境安装
1.安装erlang 语言环境 安装依赖 yum install ncurses-devel (如果没安装GCC,执行 yum install gcc或者:yum groupinstall " ...
- Python中and(逻辑与)计算法则
在程序设计中,and称为逻辑与运算,也称布尔运算:1.and是在布尔上下文中从左到右计算表达式的值:2.0.''.[].().{}.None.False在布尔上下文中为假:其它任何东西都为真:3.如果 ...
- grpc的服务注册与发现及负载
参考文章: (1)https://segmentfault.com/a/1190000008672912 (2)https://grpc.io/docs/ (3)https://github.com/ ...